Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告_第1頁(yè)
Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告_第2頁(yè)
Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告_第3頁(yè)
Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告_第4頁(yè)
Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告目錄Linux驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)報(bào)告 1實(shí)驗(yàn)一、Linux內(nèi)核移植實(shí)驗(yàn) 21.1資源 21.2解壓源碼包 31.3修改Makefile文件,支持交叉編譯 31.1得到.config文件 31.5修改NandFlash分區(qū) 41.6添加LCD支持 51.7添加網(wǎng)卡驅(qū)動(dòng) 61.8添加YAFFS文件系統(tǒng)支持 71.9內(nèi)核配置(即內(nèi)核裁剪) 71.10編譯內(nèi)核 91.11燒寫內(nèi)核 9實(shí)驗(yàn)二、ARMNorflash驅(qū)動(dòng)實(shí)驗(yàn) 102.1、環(huán)境 102.2、目的 102.3、實(shí)驗(yàn)步驟 10實(shí)驗(yàn)三、嵌入式linux驅(qū)動(dòng)實(shí)驗(yàn) 153.1、實(shí)驗(yàn)?zāi)康?153.2、實(shí)驗(yàn)原理 153.3、參考程序 163.4、實(shí)驗(yàn)步驟 243.5、實(shí)驗(yàn)結(jié)果 293.6、實(shí)驗(yàn)體會(huì) 29實(shí)驗(yàn)四、LCD驅(qū)動(dòng)實(shí)驗(yàn) 294.1、實(shí)驗(yàn)?zāi)康?294.2、實(shí)驗(yàn)設(shè)備(環(huán)境)及要求 294.3、試驗(yàn)結(jié)果 314.4、實(shí)驗(yàn)總結(jié) 31實(shí)驗(yàn)五、DM9000網(wǎng)卡驅(qū)動(dòng) 325.1、實(shí)驗(yàn)?zāi)康?325.2、實(shí)驗(yàn)設(shè)備(環(huán)境)及要求 325.3、實(shí)驗(yàn)內(nèi)容與步驟 325.4、試驗(yàn)結(jié)果 345.5、實(shí)驗(yàn)總結(jié) 34實(shí)驗(yàn)一、Linux內(nèi)核移植實(shí)驗(yàn)1.1資源linux-.tar.bz2 (Linux內(nèi)核源碼的壓縮包,下載地址)yaffs2.tar.gz (yaffs文件系統(tǒng)源碼的壓縮包)dm9000.h和dm9000.c (dm9000網(wǎng)卡驅(qū)動(dòng)程序)1.2解壓源碼包在XP中,把“01/下午/src”文件夾拷貝到“//2”的共享文件夾uptech內(nèi),并把uptech中的“src”更名為“01linux在Linux虛擬機(jī)中進(jìn)入該文件夾“cd/home/uptech/01linux”ls可見1個(gè)文件:“l(fā)inux-.tar.bz2”、“yaffs2.tar.gz”、“dm9000.h”、“dm9000.cbz2壓縮包用“tarjxvf”解壓gz壓縮包用“tarzxvf”解壓解壓Linux源碼壓縮包,即輸入命令“tarjxvflinux-.tar.bz2解壓YAFFS源碼壓縮包,即輸入命令“tarzxvfyaffs2.tar.gz”1.3修改Makefile文件,支持交叉編譯cd/home/uptech/01linux/linux-,該目錄下就是linux的內(nèi)核源碼修改Makefile文件,使之支持交叉編譯,也就是在Linux上編譯出ARM開發(fā)板上運(yùn)行的內(nèi)核程序。ARCH ?= arm (目標(biāo)平臺(tái)是arm)CROSS_COMPILE ?= arm-linux- (交叉編譯器的前綴是arm-linux-)1.1得到.config文件得到.config文件將“/home/uptech/01linux/linux-/arch/arm/configs/s3c2110_defconfig”文件拷貝成“/home/uptech/01linux/linux-/.config”cp arch/arm/configs/s3c2110_defconfig .config對(duì)內(nèi)核進(jìn)行裁剪(此時(shí)暫時(shí)不做裁剪,僅是看看)makemenuconfig1.5修改NandFlash分區(qū)修改“/home/uptech/01linux/linux-/arch/arm/plat-s3c21xx/common-smdk.c”文件中的“structmtd-partitionsmdk_default_nand_part[]”這個(gè)結(jié)構(gòu)體:第一個(gè)分區(qū)從0x00000000到0x00080000,大小為0.5M第二個(gè)分區(qū)從0x00080000到0x00280000,大小為2M第三個(gè)分區(qū)從0x00280000到0x00680000,大小為1M第四個(gè)分區(qū)從0x00680000到0x01000000,大小為57.5M具體做法:(1)viarch/arm/plat-s3c21xx/common-smdk.c(2)修改分區(qū)信息結(jié)構(gòu)體staticstructmtd_partitionsmdk_default_nand_part[]={[0]={.name="Bootloader",.size=0x80000,.offset=0,},[1]={.name="LinuxKernel",.offset=0x80000,.size=SZ_2M,},[2]={.name="RootFileSystem",.offset=0x280000,.size=SZ_1M,},[3]={.name="UserSpace",.offset=0x680000,.size=0x3980000,},};1.6添加LCD支持修改“/home/uptech/01linux/linux-/arch/arm/mach-s3c2110/mach-smdk2110.c”。具體做法:(1)viarch/arm/mach-s3c2110/mach-smdk2110.c(2)在mach-smdk2110.c文件內(nèi)添加兩個(gè)頭文件 #include<asm/arch/fb.h>#include<linux/platform_device.h>(3)在mach-smdk2110.c文件內(nèi)添加兩個(gè)結(jié)構(gòu)體 staticstructs3c2110fb_displayup2110_fb[]__initdata={{.lcdcon5=(1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0),.type=(3<<5),.width=610,.height=180,.pixclock=39721,.xres=610,.yres=180,.bpp=16,.left_margin=10,.right_margin=32,.hsync_len=32,.vsync_len=2,.upper_margin=35,.lower_margin=5,},};staticstructs3c2110fb_mach_infoup2110_fb_info__initdata={.displays=up2110_fb,.num_displays=1,.default_display=0,.gpcup=0xffffffff,.gpcup_mask=0x0,.gpccon=0xaaaaaaaa,.gpccon_mask=0x0,.gpdup=0xffffffff,.gpdup_mask=0x0,.gpdcon=0xaaaaaaaa,.gpdcon_mask=0x0,.lpcsel=0,};(1)在mach-smdk2110.c文件內(nèi),在“smdk2110_init”函數(shù)的末尾一行添加: s3c21xx_fb_set_platdata(&up2110_fb_info);1.7添加網(wǎng)卡驅(qū)動(dòng)1、修改“/home/uptech/01linux/linux-/arch/arm/mach-s3c2110/mach-smdk2110.c”。具體做法:(1)viarch/arm/mach-s3c2110/mach-smdk2110.c(2)在mach-smdk2110.c文件添加兩個(gè)結(jié)構(gòu)體,用于定義端口地址和中斷號(hào)等設(shè)備信息staticstructresources3c_dm9ks_resource[]={[0]={.start=0x10000000,.end=0x10000010,.flags=IORESOURCE_MEM,},[1]={.start=IRQ_EINT2,.end=IRQ_EINT2,.flags=IORESOURCE_IRQ,},};structplatform_devices3c_device_dm9ks={.name="s3c2110-dm9ks",.id=-1,.num_resources=ARRAY_SIZE(s3c_dm9ks_resource),.resource=s3c_dm9ks_resource,};(3)在“structplatform_device*smdk2110_devices[]__initdata”末尾加入網(wǎng)卡數(shù)據(jù):&s3c_device_dm9ks,2、將新的“dm9000.c”和“dm9000.h”拷貝到“/home/uptech/01linux/linux-/drivers/net”文件夾內(nèi),替換舊的文件。 cp /home/uptech/01linux/dm9000.* drivers/net/ 在dm9000.c文件中增加了uptech_dm9k_init函數(shù),并在dm9k_init_module(void)函數(shù)中調(diào)用了uptech_dm9k_init。1.8添加YAFFS文件系統(tǒng)支持1、進(jìn)入yaffs解壓后的文件夾cd/home/uptech/01linux/yaffs22、給Linux打補(bǔ)丁 ./patch-ker.shc../linux-/3、進(jìn)入linux內(nèi)核文件夾cd/home/uptech/01linux/linux-1.9內(nèi)核配置(即內(nèi)核裁剪)1、運(yùn)行“makemenuconfig”,進(jìn)入內(nèi)核配置界面2、選擇硬件系統(tǒng) SystemTypeS3C2110Machines[*]SMDK2110/A9M2110 其他不要選,以免內(nèi)核太大3、配置NandFlash驅(qū)動(dòng)DeviceDrivers<*>MemoryTechnologyDevice(MTD)support<*>NANDDeviceSupport<*>NANDFlashsupportforS3C2110/S3C2110SoC1、配置LCD驅(qū)動(dòng)DeviceDriversGraphicssupport<*>Supportforframebufferdevices<*>S3C2110LCDframebuffersupportDeviceDriversGraphicssupport[*]Bootuplogo[*]StandardblackandwhiteLinuxlogo[*]Standard16-colorLinuxlogo[*]Standard221-colorLinuxlogo5、配置網(wǎng)卡驅(qū)動(dòng) DeviceDrivers[*]Networkdevicesupport[*]Ethernet(10or100Mbit)-*-GenericMediaIndependentInterfacedevicesupport<>ASIXAX88796NE2021clonesupport[]ASIXAX88796external93CX6eepromsupport<>SMC91C9x/91C1xxxsupport<*>DM9000support<>Broadcom110x/17xxethernetsupport6、配置文件系統(tǒng)支持CRAMFS文件系統(tǒng)、YAFFS文件系統(tǒng)、NFS文件系統(tǒng)FilesystemsMiscellaneousfilesystems <*>YAFFS2filesystemsupport-*-512byte/pagedevices[]Useolder-styleon-NANDdataformatwithpageStatusbyte[]LetsYaffsdoitsownECC-*-2021byte(orlarger)/pagedevices[*]Autoselectyaffs2format[]Disablelazyloading[]Turnoffwidetnodes[]Forcechunkerasecheck[*]CacheshortnamesinRAM<>JournallingFlashFileSystemv2(JFFS2)support<*>CompressedROMfilesystemsupport(cramfs)Filesystems[*]NetworkFileSystems <*>NFSfilesystemsupport[*]ProvideNFSv3clientsupport[*]ProvideclientsupportfortheNFSv3ACLprotocolextension[]ProvideNFSv1clientsupport(EXPERIMENTAL)[*]AllowdirectI/OonNFSfiles<>NFSserversupport[*]RootfilesystemonNFS1.10編譯內(nèi)核在“/home/uptech/01linux/linux-”文件夾內(nèi)運(yùn)行:makecleanmake 之后會(huì)在“/home/uptech/01linux/linux-/arch/arm/boot/”內(nèi)生成內(nèi)核鏡像文件zImage通過(guò)zImage生成uImage(1)新建文件夾“/home/uptech/image” mkdir/home/uptech/image cd /home/uptech/image(2)把“/home/uptech/03u-boot/u-boot-1.3.2/tools/mkimage”拷貝到“/home/uptech/image/” cp /home/uptech/03u-boot/u-boot-1.3.2/tools/mkimage .(3)把“/home/uptech/01linux/linux-/arch/arm/boot/zImage”拷貝到“/home/uptech/image/” cp /home/uptech/01linux/linux-/arch/arm/boot/zImage . (1)生成uImage ./mkimage–Aarm–Tkernel–Cnone–Olinux–a0x30008000–e0x30008010–dzImage–n‘Linux-2.6.21’uImage1.11燒寫內(nèi)核確認(rèn)serverip是Linux虛擬機(jī)的IP地址(1)執(zhí)行“printenv”,查看serverip是否與Linux虛擬機(jī)的IP地址一致(2)若不一致,執(zhí)行“setenvserverip2”來(lái)指定tftp服務(wù)器的IP地址(3)執(zhí)行“saveenv”保存設(shè)置。將生成的uImage文件拷貝到tftpboot目錄下:cpuImage/tftpboot在ARM開發(fā)板上運(yùn)行命令:tftp0x30008000uImage (把uImage文件下載到ARM開發(fā)板的SDRAM中0x30008000開始的空間中)nanderase0x800000x202100 (擦除NandFlash中起始地址為0x80000,大小為0x202100的空間)nandwrite0x300080000x800000x202100 (把SDRAM中0x30008000開始的內(nèi)容寫入NandFlash0x80000開始的空間內(nèi),大小為0x202100)重啟ARM開發(fā)板,執(zhí)行命令“bootm”,此時(shí)液晶屏左上角出現(xiàn)小企鵝圖案。實(shí)驗(yàn)二、ARMNorflash驅(qū)動(dòng)實(shí)驗(yàn)2.1、環(huán)境目標(biāo)板:mini2440(S3C2440)交叉編譯器:arm-linux-gcc-4.3.2操作系統(tǒng):Linux(Ubuntu-11.10)2.2、目的移植mini2440板子上為2M的NorFlash(型號(hào)為SST39VF1601)驅(qū)動(dòng)2.3、實(shí)驗(yàn)步驟(一).添加配置項(xiàng)

1、修改drivers/mtd/maps/Kconfig文件,在config_EDB7312配置項(xiàng)下添加如下內(nèi)容:

configMTD_MINI2440

tristate"CFIFlashdevicemappedonMINI2440"

dependsonARM&&MTD_CFI

help

ThisenablesaccesstotheCFIFlashontheCogentMINI2440board.

Ifyouhavesuchaboard,say'Y'here.

2、修改drivers/mtd/maps/Makefile文件,在obj-$(CONFIG_MTD_EDB7312)+=edb7312.o下添加如下內(nèi)容:

obj-$(CONFIG_MTD_MINI2440)+=mini2440.o

3、復(fù)制驅(qū)動(dòng)文件mini2440.c到drivers/mtd/maps目錄下

(二).配置編譯內(nèi)核

#makemenuconfig

以下內(nèi)容必選:

MemoryTechnologyDevices(MTD)-->

<*>MemoryTechnologyDevice(MTD)support

[*]MTDpartitioningsupport

<*>DirectchardeviceaccesstoMTDdevices

<*>CachingblockdeviceaccesstoMTDdevices

RAM/ROM/Flashchipdrivers-->

<*>DetectflashchipsbyCommonFlashInterface(CFI)probe

<*>SupportforInter/Sharpflashchips

<*>SupportforAMD/Fujitsu/Spansionflashchips

<*>CFIflashdevicemappedonmini2440

下列內(nèi)容(在flash上架fat16/fat32/ntfs/ext2等文件系統(tǒng)時(shí)才需要選上)不要選,否則會(huì)出現(xiàn)加載驅(qū)動(dòng)模塊時(shí)會(huì)出現(xiàn)ftl_cs:FTLheadernotfound.

DeviceDrivers->

MemoryTechnologyDevices(MTD)->

<>FTL(FlashTranslationLayer)support

<>NFTL(NANDFlashTranslationLayer)support

<>INFTL(InverseNANDFlashTranslationLayer)support(三).根據(jù)edb7312單板的norflash驅(qū)動(dòng)(linux/mtd/maps/edb7312.c)來(lái)寫mini2440的norflash驅(qū)動(dòng)

代碼在mini2440.c中(帶詳細(xì)注釋)/*支持單板:mini2440

*支持內(nèi)核:3.1.2版本

*模仿驅(qū)動(dòng):/linux/drivers/mtd/maps/edb7312.c

*/

#include<linux/module.h>

#include<linux/types.h>

#include<linux/kernel.h>

#include<linux/init.h>

#include<asm/io.h>

#include<linux/mtd/mtd.h>

#include<linux/mtd/map.h>

#include<linux/mtd/partitions.h>

#defineWINDOW_ADDR0x00000000/*NORFLASH物理地址*/

#defineWINDOW_SIZE0x00202100/*NORFLASH大小*/

#defineBUSWIDTH2/*估計(jì)是2Byte*/

/*探測(cè)的接口類型,可以是"cfi_probe","jedec_probe","map_rom",NULL};*/

#definePROBETYPES{"cfi_probe",NULL}

#defineMSG_PREFIX"MINI2440-NOR:"/*printk的前綴*/

#defineMTDID"mini2440-nor"/*MTD驅(qū)動(dòng)*/

staticstructmtd_info*mymtd;

/*定義一個(gè)map_info,代表一塊norflash*/

structmap_infomini2440nor_map=

{

.name="NORflashonMINI2440",

.size=WINDOW_SIZE,

.bankwidth=BUSWIDTH,

.phys=WINDOW_ADDR,

};

/*默認(rèn)分區(qū)信息*/

staticstructmtd_partitionstatic_partitions[3]=

{

{

.name="bootloader",

.size=0x40000,//256K

.offset=0

},

{

.name="Kernel",

.size=0x100000,//1M

.offset=0x40000

},

{

.name="RootFS",

.size=0xC0000,//768K

.offset=0x140000

},

};

staticconstchar*probes[]={NULL};

staticintmtd_parts_nb=0;

staticstructmtd_partition*mtd_parts=0;

/*Norflash模型初始化函數(shù)

*<1>物理地址映射為虛擬地址:mini2440nor_map.virt=ioremap(WINDOW_ADDR,WINDOW_SIZE);

*<2>探測(cè)norflash芯片,得到map_info:do_map_probe();//應(yīng)該是mtd_info,而不是map_info,轉(zhuǎn)載者注釋

*<3>探測(cè)分區(qū)信息,得到mtd_partition:parse_mtd_partitions();

*<4>利用map_info和mtd_partition注冊(cè)設(shè)備:mtd_device_register();//應(yīng)該是mtd_info,而不是map_info,轉(zhuǎn)載者注釋

*/

int__initinit_mini2440nor(void)

{

staticconstchar*rom_probe_types[]=PROBETYPES;

constchar**type;

constchar*part_type=0;

printk(KERN_NOTICEMSG_PREFIX"0x%08xat0x%08x\n",WINDOW_SIZE,WINDOW_ADDR);

/*物理地址映射為虛擬地址*/

mini2440nor_map.virt=ioremap(WINDOW_ADDR,WINDOW_SIZE);

if(!mini2440nor_map.virt)

{

printk(MSG_PREFIX"failedtoioremap\n");

return-EIO;

}

simple_map_init(&mini2440nor_map);

mymtd=0;

type=rom_probe_types;

for(;!mymtd&&*type;type++)

{

/*根據(jù)map_info探測(cè)norflash芯片,若成功則返回mtd_info*/

mymtd=do_map_probe(*type,&mini2440nor_map);

}

if(mymtd)

{

mymtd->owner=THIS_MODULE;

/*探測(cè)分區(qū)信息,若探測(cè)成功,則mtd_parts中保存了分區(qū)信息;若探測(cè)失敗,使用數(shù)組定義的默認(rèn)分區(qū)信息*/

mtd_parts_nb=parse_mtd_partitions(mymtd,probes,&mtd_parts,MTDID);

if(mtd_parts_nb>0)

part_type="detected";

if(mtd_parts_nb==0)

{

mtd_parts=static_partitions;

mtd_parts_nb=ARRAY_SIZE(static_partitions);

part_type="static";

}

if(mtd_parts_nb==0)

printk(KERN_NOTICEMSG_PREFIX"nopartitioninfoavailable\n");

else

printk(KERN_NOTICEMSG_PREFIX"using%spartitiondefinition\n",

part_type);

/*注冊(cè)設(shè)備*/

mtd_device_register(mymtd,NULL,0);

mtd_device_register(mymtd,mtd_parts,mtd_parts_nb);

return0;

}

iounmap((void*)mini2440nor_map.virt);

return-ENXIO;

}

/*Norflash模塊卸載函數(shù)

*<1>注銷設(shè)備:mtd_device_unregister();

*<2>銷毀map_info:map_destroy();

*<3>取消映射:iounmap();

*/

staticvoid__exitcleanup_mini2440nor(void)

{

if(mymtd)

{

/*注銷設(shè)備*/

mtd_device_unregister(mymtd);

/*銷毀map_info*/

map_destroy(mymtd);

}

if(mini2440nor_map.virt)

{

iounmap((void*)mini2440nor_map.virt);

mini2440nor_map.virt=0;

}

}

module_init(init_mini2440nor);

module_exit(cleanup_mini2440nor);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("WeiDongWu<625769020@>");

MODULE_DESCRIPTION("GenericconfigurableMTDmapdriver");實(shí)驗(yàn)三、嵌入式linux驅(qū)動(dòng)實(shí)驗(yàn)3.1、實(shí)驗(yàn)?zāi)康陌惭blinux-2.6.38讓Makefile中的路徑與linux-2.6.38保持一致。修改驅(qū)動(dòng).c文件,使得用pc0來(lái)控制紅燈。通過(guò)交叉編譯器進(jìn)行交叉編譯生成可執(zhí)行文件通過(guò)tftp傳送文件。實(shí)現(xiàn)驅(qū)動(dòng)的加載和卸載。3.2、實(shí)驗(yàn)原理1)工作原理框圖2)工作原理根據(jù)上圖通過(guò)編寫驅(qū)動(dòng)程序可以控制pc0接口,當(dāng)它高電平時(shí),D9led燈熄滅;當(dāng)它低電平時(shí),D9led燈點(diǎn)亮。在編寫適當(dāng)?shù)膽?yīng)用程序完成實(shí)驗(yàn)。3.3、參考程序Led_app.c(應(yīng)用程序)#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/ioctl.h>#include<sys/mman.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#defineLED_DEVICE"/dev/led_cugb"#defineLED_ON0#defineLED_OFF1staticunsignedcharbuf_wr[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};staticunsignedcharbuf_rd[10];intmain(){intfd;intval=-1; inti,ret;if((fd=open(LED_DEVICE,O_RDWR))<0){printf("opendeviceerror!\r\n");exit(1);}while(1){printf("0:LEDON,1:LEDOFF,2:Writetest,3:Readtest,4:quit\r\n");scanf("%d",&val); switch(val) { case0: ioctl(fd,LED_ON,0); break; case1: ioctl(fd,LED_OFF,0); break; case2: ret=write(fd,buf_wr,sizeof(buf_wr)); if(ret<0) { printf("Writeerror!\r\n"); } break; case3: ret=read(fd,buf_rd,sizeof(buf_rd)); if(ret>=0) { printf("app:read%dbytes:",ret); for(i=0;i<ret;i++) { printf("0x%02x",buf_rd[i]); } printf("\r\n"); } else { printf("Readerror!\r\n"); } break; case4: close(fd); exit(1); break; default: printf("inputerror!\r\n"); }}}led_drv.c(驅(qū)動(dòng).c)#include<linux/init.h>#include<linux/module.h>#include<linux/fs.h>#include<linux/major.h>#include<linux/cdev.h>#include<linux/poll.h>#include<linux/ioctl.h>#include<asm/system.h>#include<asm/uaccess.h>#include<mach/hardware.h>#include<mach/at91rm9200.h>#include<mach/gpio.h>MODULE_LICENSE("GPL");MODULE_AUTHOR("Mr.Zeng");MODULE_VERSION("V1.0");MODULE_DESCRIPTION("LedDriverforAT91RM9200");#defineLED_MAJOR 231#defineDEVICE_NAME"led_cugb"#defineLED_ON0#defineLED_OFF1#defineBUF_SIZE64staticunsignedcharg_buf[BUF_SIZE];staticintled_open(structinode*inode,structfile*filp){intminor,i;minor=MINOR(inode->i_rdev); at91_set_gpio_output(AT91_PIN_PC2,1); for(i=0;i<BUF_SIZE;i++) { g_buf[i]=0x00; } printk("%sok\r\n",__FUNCTION__);return0;}staticssize_tled_read(structfile*filp,char__user*pbuf,size_tSize,loff_t*other){ size_tsize_local; size_local=Size; if(Size>BUF_SIZE) size_local=BUF_SIZE; copy_to_user(pbuf,g_buf,size_local); printk("driver:read%dbytes\r\n",size_local); printk("%sok\r\n",__FUNCTION__); returnsize_local;}staticssize_tled_write(structfile*filp,constchar__user*pbuf,size_tSize,loff_t*other){ inti; size_tsize_local; size_local=Size; if(Size>BUF_SIZE) size_local=BUF_SIZE; copy_from_user(g_buf,pbuf,size_local); printk("driver:write%dbyte:",size_local); for(i=0;i<size_local;i++) { printk("0x%02x",g_buf[i]); } printk("\r\n"); printk("%sok\r\n",__FUNCTION__);return0;}staticintled_release(structinode*inode,structfile*filp){ printk("%sok\r\n",__FUNCTION__);return0;}staticlongled_ctl_ioctl(structfile*filp,unsignedintcommand,unsignedlongarg){interr=0;switch(command){caseLED_OFF:err=at91_set_gpio_value(AT91_PIN_PC2,1);break;caseLED_ON:err=at91_set_gpio_value(AT91_PIN_PC2,0);break; } printk("%sok\r\n",__FUNCTION__);returnerr;}staticstructfile_operationsled_ctl_fops={ .owner=THIS_MODULE, .open=led_open, .write =led_write, .read =led_read, .unlocked_ioctl=led_ctl_ioctl,//.ioctl-->.unlocked_ioctl.release=led_release,};staticint__initled_init(void){ intret;ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&led_ctl_fops); if(ret<0) { printk(DEVICE_NAME"registerfailed\r\n"); } else { printk(DEVICE_NAME"registerok\r\n"); } returnret;}staticvoid__exitled_exit(void){ unregister_chrdev(LED_MAJOR,DEVICE_NAME); printk(DEVICE_NAME"unregisterok\r\n");}module_init(led_init);module_exit(led_exit);3.4、實(shí)驗(yàn)步驟1、解壓linux-2.6.38.tar.bz2到/home/at9200/kernel/linux-2.6.38/的目錄下;2、交叉編譯生成可執(zhí)行文件led_app指令:arm-linux-gcc–oled_appled_app.c3、用make指令生成led_drv.ko(文件目錄下包含led_drv.c和Makefile)4、用tftp傳送led_app,led_drv.ko兩個(gè)文件到目標(biāo)板上(1)啟動(dòng)tftp,設(shè)置好共享目錄,并將led_app,led_drv.ko置于目錄下。(2)啟動(dòng)超級(jí)終端,建立好連接(3)設(shè)置好目標(biāo)板的Ip地址(4)進(jìn)入到j(luò)ffs2的目錄下(5)用tftp傳送文件(6)加載驅(qū)動(dòng)(7)chmod777led_app(8)設(shè)定主設(shè)備號(hào)(9)運(yùn)行(10)卸載3.5、實(shí)驗(yàn)結(jié)果在開發(fā)板上會(huì)發(fā)現(xiàn)在超級(jí)終端界面上輸入0時(shí)紅燈亮;輸入1時(shí)紅燈滅。3.6、實(shí)驗(yàn)體會(huì)通過(guò)這次的實(shí)驗(yàn)我初步了解到了嵌入式系統(tǒng)中驅(qū)動(dòng)程序的編寫,以及如何加載和卸載。也讓我認(rèn)識(shí)到了驅(qū)動(dòng)程序與應(yīng)用程序之間的區(qū)別,驅(qū)動(dòng)程序中是不含有main函數(shù)的,而應(yīng)用程序中是含有main函數(shù)的,此外我通過(guò)這次實(shí)驗(yàn)完成了用軟件實(shí)時(shí)操作硬件,引起了我的興趣和求知欲,我想這會(huì)有利于我以后對(duì)嵌入式系統(tǒng)的學(xué)習(xí)。實(shí)驗(yàn)四、LCD驅(qū)動(dòng)實(shí)驗(yàn)4.1、實(shí)驗(yàn)?zāi)康?.了解LCD基本概念與原理。2.了解Linux下LCD的Framebuffer結(jié)構(gòu)原理3.了解用總線方式驅(qū)動(dòng)LCD模塊。4.熟悉用ARM內(nèi)置的LCD控制器驅(qū)動(dòng)LCD。4.2、實(shí)驗(yàn)設(shè)備(環(huán)境)及要求硬件:嵌入式開發(fā)板、PC機(jī)Pentumn500以上,硬盤10G以上。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+ARM-LINUX開發(fā)環(huán)境4.3、實(shí)驗(yàn)內(nèi)容與步驟1打開一個(gè)命令終端,并切換到內(nèi)核目錄樹的最頂層(linux-2.6.9)運(yùn)行makemenuconfigMakemenuconfig->Graphicssupport,修改為M,即編譯成模塊,保存退出后,makezImage編譯成內(nèi)核鏡像2把/up-techpxa270/exp/kernel/linux-2.6.9/drivers/video目錄下的幾個(gè)關(guān)于lcd的文件拷貝到我們自己建立的工作目錄下(/up-techpxa270/exp/drivers/lcd)3進(jìn)入Makefile修改Makefile如下(makefile使用上節(jié)課/up-techpxa270/exp/drivers/dm9000里的makefile)保存后make編譯生成下述文件4首先,動(dòng)pxa270開發(fā)板,進(jìn)入minicom按任意鍵進(jìn)入blob下載內(nèi)核鏡像并啟動(dòng)可以發(fā)現(xiàn)開發(fā)板上的lcd無(wú)顯示掛載后切換到我們的工作目錄下逐個(gè)加載模塊文件可以看到lcd正常顯示運(yùn)行Udevstart命令更新設(shè)備節(jié)點(diǎn):顯示我們事先準(zhǔn)備好的一張圖像進(jìn)行測(cè)試顯示成功4.3、試驗(yàn)結(jié)果4.4、實(shí)驗(yàn)總結(jié)在設(shè)計(jì)過(guò)程中,通過(guò)本次實(shí)驗(yàn),我了解LCD顯示器的結(jié)構(gòu)特點(diǎn),了解S3C2410的LCD驅(qū)動(dòng)模塊工作原理,掌握用簡(jiǎn)單LCD驅(qū)動(dòng)程序設(shè)計(jì)等,與同學(xué)分工設(shè)計(jì),和同學(xué)們相互探討,相互學(xué)習(xí),相互監(jiān)督。學(xué)會(huì)了合作。課程設(shè)計(jì)是我們專業(yè)課程知識(shí)綜合應(yīng)用的實(shí)踐訓(xùn)練,從事職業(yè)工作前一個(gè)必不少的過(guò)程.在這次設(shè)計(jì)過(guò)程中,體現(xiàn)出設(shè)計(jì)ARM驅(qū)動(dòng)程序的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出自己勞動(dòng)成果的喜悅心情,從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)節(jié),從而加以彌補(bǔ)。實(shí)驗(yàn)五、DM9000網(wǎng)卡驅(qū)動(dòng)5.1、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)在LINUX下進(jìn)行網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)的原理、理解網(wǎng)卡驅(qū)動(dòng)的體系結(jié)構(gòu)和接口實(shí)現(xiàn)過(guò)程。2.掌握DM9000網(wǎng)卡驅(qū)動(dòng)的工作原理和流程。5.2、實(shí)驗(yàn)設(shè)備(環(huán)境)及要求硬件:PC機(jī)pentumn500以上,硬盤40G以上,內(nèi)存大于128M。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+AMRLINUX開發(fā)環(huán)境5.3、實(shí)驗(yàn)內(nèi)容與步驟1)進(jìn)入/up-techpxa270/exp/kernel/linux-2.6.9MakemenuconfigNetworkingsupportEthernet(10or100Mbit)DM9000support選擇編譯成模塊2)makezImage并拷貝到/tftpboot目錄下3)在/up-techpxa270/exp/drivers/目錄下新建一個(gè)目錄dm9000,拷貝/up-techpxa270/exp/kernel/linux-2.6.9/drivers/net/目錄下的dm9000x.c,dm9000x.h以及/up-techpxa270/exp/drivers/01_moddriver/目錄下的Makefile文件。編譯dm9000x模塊生成.ko文件4)修改Makefile文件編譯DM9000相關(guān)源文件5)啟動(dòng)目標(biāo)機(jī),先掛載到宿主機(jī)上把dm9000x.ko文件下載到目標(biāo)機(jī)的root目錄下重啟目標(biāo)機(jī),進(jìn)入blob模式下載修改過(guò)后的內(nèi)核鏡像并啟動(dòng)6)測(cè)試網(wǎng)卡是否工作5.4、試驗(yàn)結(jié)果5.5、實(shí)驗(yàn)總結(jié)在設(shè)計(jì)過(guò)程中,必須小心謹(jǐn)慎,稍有一點(diǎn)錯(cuò)誤就會(huì)使實(shí)驗(yàn)失敗,這里包括程序的編寫,也包括實(shí)際的具體操作步驟。軟件的規(guī)范開啟關(guān)閉,實(shí)驗(yàn)箱的模塊開啟先后,各個(gè)軟件打開的先后順序等。通過(guò)對(duì)硬件的設(shè)計(jì)和軟件的編寫以及系統(tǒng)的調(diào)試,該設(shè)計(jì)基本上已經(jīng)達(dá)到了設(shè)計(jì)的預(yù)期目的。開發(fā)了DM9000驅(qū)動(dòng)程序,并成功應(yīng)用于基于ARM核的嵌入式系統(tǒng)中,說(shuō)明該設(shè)計(jì)可以正常運(yùn)行在相應(yīng)的環(huán)境之中,為系統(tǒng)提供了便捷的人機(jī)接口,提高了儀器的性能。

論大學(xué)生寫作能力寫作能力是對(duì)自己所積累的信息進(jìn)行選擇、提取、加工、改造并將之形成為書面文字的能力。積累是寫作的基礎(chǔ),積累越厚實(shí),寫作就越有基礎(chǔ),文章就能根深葉茂開奇葩。沒有積累,胸?zé)o點(diǎn)墨,怎么也不會(huì)寫出作文來(lái)的。寫作能力是每個(gè)大學(xué)生必須具備的能力。從目前高校整體情況上看,大學(xué)生的寫作能力較為欠缺。一、大學(xué)生應(yīng)用文寫作能力的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論