Linux驅動開發(fā)實驗報告_第1頁
Linux驅動開發(fā)實驗報告_第2頁
Linux驅動開發(fā)實驗報告_第3頁
Linux驅動開發(fā)實驗報告_第4頁
Linux驅動開發(fā)實驗報告_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux驅動開發(fā)實驗報告目錄Linux驅動開發(fā)實驗報告1實驗一、Linux內核移植實驗21.1 資源21.2 解壓源碼包31.3 修改Makefile文件,支持交叉編譯31.1 得到.config文件31.5 修改Nand Flash分區(qū)31.6 添加LCD支持51.7 添加網卡驅動61.8 添加YAFFS文件系統(tǒng)支持71.9 內核配置(即內核裁剪)71.10 編譯內核91.11 燒寫內核9實驗二、ARM Norflash驅動實驗102.1、環(huán)境102.2、目的102.3、實驗步驟10實驗三、嵌入式linux驅動實驗153.1、實驗目的153.2、實驗原理153.3、參考程序163.4、實驗

2、步驟243.5、實驗結果293.6、實驗體會29實驗四、LCD驅動實驗294.1、實驗目的294.2、實驗設備(環(huán)境)及要求294.3、試驗結果314.4、實驗總結31實驗五、DM9000網卡驅動325.1、實驗目的325.2、實驗設備(環(huán)境)及要求325.3、實驗內容與步驟325.4、試驗結果345.5、實驗總結34實驗一、Linux內核移植實驗1.1 資源1. linux-.tar.bz2(Linux內核源碼的壓縮包,下載地址)2. yaffs2.tar.gz(yaffs文件系統(tǒng)源碼的壓縮包)3. dm9000.h和dm9000.c(dm9000

3、網卡驅動程序)1.2 解壓源碼包1. 在XP中,把“01/下午/src”文件夾拷貝到“/2”的共享文件夾uptech內,并把uptech中的“src”更名為“01 linux”2. 在Linux虛擬機中進入該文件夾“cd /home/uptech/01 linux”ls可見1個文件:“l(fā)inux-.tar.bz2”、“yaffs2.tar.gz”、“dm9000.h”、“dm9000.c”u bz2壓縮包用“tar jxvf”解壓u gz壓縮包用“tar zxvf”解壓3. 解壓Linux源碼壓縮包,即輸入命令“tar jxvf linux-2.6.21.

4、1.tar.bz2”4. 解壓YAFFS源碼壓縮包,即輸入命令“tar zxvf yaffs2.tar.gz”1.3 修改Makefile文件,支持交叉編譯1. cd /home/uptech/01 linux/linux-,該目錄下就是linux的內核源碼2. 修改Makefile文件,使之支持交叉編譯,也就是在Linux上編譯出ARM開發(fā)板上運行的內核程序。ARCH?=arm(目標平臺是arm)CROSS_COMPILE?=arm-linux-(交叉編譯器的前綴是arm-linux-)1.1 得到.config文件1. 得到.config文件將“/home/uptech/0

5、1 linux/linux-/arch/arm/configs/s3c2110_defconfig”文件拷貝成“/home/uptech/01 linux/linux-/.config”cparch/arm/configs/s3c2110_defconfig.config2. 對內核進行裁剪(此時暫時不做裁剪,僅是看看)make menuconfig1.5 修改Nand Flash分區(qū)修改“/home/uptech/01 linux/linux-/arch/arm/plat-s3c21xx/common-smdk.c”文件中的“struct mt

6、d-partition smdk_default_nand_part”這個結構體:第一個分區(qū)從0x0000 0000 到 0x0008 0000,大小為0.5M第二個分區(qū)從0x0008 0000 到 0x0028 0000,大小為2M第三個分區(qū)從0x0028 0000 到 0x0068 0000,大小為1M第四個分區(qū)從0x0068 0000 到 0x0100 0000,大小為57.5M具體做法:(1) vi arch/arm/plat-s3c21xx/common-smdk.c(2)修改分區(qū)信息結構體static struct mtd_partition smdk_default_nand_p

7、art = 0 = .name = Bootloader,.size = 0x80000,.offset = 0,1 = .name = Linux Kernel,.offset = 0x80000,.size = SZ_2M,2 = .name = Root File System,.offset = 0x,.size = SZ_1M,3 = .name = User Space,.offset = 0x,.size = 0x,;1.6 添加LCD支持修改“/home/uptech/01 linux/linux-/arch/arm/mach-s3c2110/mach-smdk

8、2110.c”。具體做法:(1)vi arch/arm/mach-s3c2110/mach-smdk2110.c(2)在mach-smdk2110.c文件內添加兩個頭文件#include #include (3)在mach-smdk2110.c文件內添加兩個結構體static struct s3c2110fb_display up2110_fb _initdata =.lcdcon5 = (112)|(111)|(19)|(18)|(10),.type = (35),.width = 610,.height = 180,.pixclock = 39721,.xres = 610,.yres =

9、 180,.bpp = 16,.left_margin = 10,.right_margin = 32,.hsync_len = 32,.vsync_len = 2,.upper_margin = 35,.lower_margin = 5,;static struct s3c2110fb_mach_info up2110_fb_info _initdata =.displays = up2110_fb,.num_displays = 1,.default_display = 0,.gpcup = 0xffffffff,.gpcup_mask = 0x0,.gpccon = 0xaaaaaaaa

10、,.gpccon_mask = 0x0,.gpdup = 0xffffffff,.gpdup_mask = 0x0,.gpdcon = 0xaaaaaaaa,.gpdcon_mask = 0x0,.lpcsel = 0,;(1)在mach-smdk2110.c文件內,在“smdk2110_init”函數的末尾一行添加:s3c21xx_fb_set_platdata(&up2110_fb_info);1.7 添加網卡驅動1、修改“/home/uptech/01 linux/linux-/arch/arm/mach-s3c2110/mach-smdk2110.c”。具體做法:(1)

11、vi arch/arm/mach-s3c2110/mach-smdk2110.c(2)在mach-smdk2110.c文件添加兩個結構體,用于定義端口地址和中斷號等設備信息static struct resource s3c_dm9ks_resource = 0 = .start = 0x,.end = 0x,.flags = IORESOURCE_MEM,1 = .start = IRQ_EINT2,.end = IRQ_EINT2,.flags = IORESOURCE_IRQ,;struct platform_device s3c_device_dm9ks = .name = s3c21

12、10-dm9ks,.id = -1,.num_resources = ARRAY_SIZE(s3c_dm9ks_resource),.resource = s3c_dm9ks_resource,;(3)在“struct platform_device *smdk2110_devices _initdata”末尾加入網卡數據:&s3c_device_dm9ks,2、將新的“dm9000.c”和“dm9000.h”拷貝到“/home/uptech/01 linux/linux-/drivers/net”文件夾內,替換舊的文件。cp/home/uptech/01 linux/dm90

13、00.*drivers/net/在dm9000.c文件中增加了uptech_dm9k_init函數,并在dm9k_init_module(void)函數中調用了uptech_dm9k_init。1.8 添加YAFFS文件系統(tǒng)支持1、進入yaffs解壓后的文件夾cd /home/uptech/01 linux/yaffs22、給Linux打補丁./patch-ker.sh c ./linux-/3、進入linux內核文件夾cd /home/uptech/01 linux/linux-1.9 內核配置(即內核裁剪)1、運行“make menuconfig”,進入內核

14、配置界面2、選擇硬件系統(tǒng)System Type S3C2110 Machines * SMDK2110/A9M2110其他不要選,以免內核太大3、配置Nand Flash驅動Device Drivers Memory Technology Device (MTD) support NAND Device Support NAND Flash support for S3C2110/S3C2110 SoC1、配置LCD驅動Device Drivers Graphics support Support for frame buffer devices S3C2110 LCD framebuffer

15、 supportDevice Drivers Graphics support * Bootup logo * Standard black and white Linux logo* Standard 16-color Linux logo* Standard 221-color Linux logo5、配置網卡驅動Device Drivers* Network device support* Ethernet (10 or 100Mbit)-*- Generic Media Independent Interface device support ASIX AX88796 NE2000 c

16、lone support ASIX AX88796 external 93CX6 eeprom support SMC 91C9x/91C1xxx supportDM9000 support Broadcom 110x/17xx ethernet support6、配置文件系統(tǒng)支持CRAMFS文件系統(tǒng)、YAFFS文件系統(tǒng)、NFS文件系統(tǒng)File systemsMiscellaneous filesystems YAFFS2 file system support-*- 512 byte / page devices Use older-style on-NAND data format wit

17、h pageStatus byte Lets Yaffs do its own ECC-*- 2018 byte (or larger) / page devices* Autoselect yaffs2 format Disable lazy loading Turn off wide tnodes Force chunk erase check* Cache short names in RAM Journalling Flash File System v2 (JFFS2) support Compressed ROM file system support (cramfs)File s

18、ystems * Network File Systems NFS file system support* Provide NFSv3 client support* Provide client support for the NFSv3 ACL protocol extension Provide NFSv1 client support (EXPERIMENTAL)* Allow direct I/O on NFS files NFS server support* Root file system on NFS1.10 編譯內核1. 在“/home/uptech/01 linux/l

19、inux-”文件夾內運行:make cleanmake之后會在“/home/uptech/01 linux/linux-/arch/arm/boot/”內生成內核鏡像文件zImage2. 通過zImage生成uImage(1)新建文件夾“/home/uptech/image”mkdir /home/uptech/imagecd/home/uptech/image(2)把“/home/uptech/03 u-boot/u-boot-1.3.2/tools/mkimage”拷貝到“/home/uptech/image/”cp/home/uptech/03 u-boo

20、t/u-boot-1.3.2/tools/mkimage.(3)把“/home/uptech/01 linux/linux-/arch/arm/boot/zImage”拷貝到“/home/uptech/image/”cp/home/uptech/01 linux/linux-/arch/arm/boot/zImage.(1)生成uImage./mkimage A arm T kernel C none O linux a 0x e 0x d zImage n Linux-2.6.21 uImage1.11 燒寫內核1. 確認serverip是Linux虛擬機的I

21、P地址(1)執(zhí)行“printenv”,查看serverip是否與Linux虛擬機的IP地址一致(2)若不一致,執(zhí)行“setenv serverip 2”來指定tftp服務器的IP地址(3)執(zhí)行“saveenv”保存設置。2. 將生成的uImage文件拷貝到tftpboot目錄下:cp uImage /tftpboot3. 在ARM開發(fā)板上運行命令:tftp 0x uImage(把uImage文件下載到ARM開發(fā)板的SDRAM中0x開始的空間中)nand erase 0x80000 0x(擦除Nand Flash中起始地址為0x80000,大小為0x的空間)nand wri

22、te 0x 0x80000 0x(把SDRAM中0x開始的內容寫入Nand Flash0x80000開始的空間內,大小為0x)4. 重啟ARM開發(fā)板,執(zhí)行命令“bootm”,此時液晶屏左上角出現小企鵝圖案。實驗二、ARM Norflash驅動實驗2.1、環(huán)境目標板:mini2440(S3C2440)交叉編譯器:arm-linux-gcc-4.3.2操作系統(tǒng):Linux(Ubuntu-11.10)2.2、目的移植mini2440板子上為2M的Nor Flash(型號為SST39VF1601)驅動2.3、實驗步驟(一).添加配置項1、修改 drivers/mtd/maps/Kconfig文件,在c

23、onfig_EDB7312配置項下添加如下內容:config MTD_MINI2440tristate CFI Flash device mapped onMINI2440depends on ARM & MTD_CFIhelpThis enables access to the CFI Flash on the CogentMINI2440 board.If you have such a board, say Y here.2、修改 drivers/mtd/maps/Makefile文件,在obj-$(CONFIG_MTD_EDB7312)+= edb7312.o下添加如下內容:obj-$

24、(CONFIG_MTD_MINI2440)+= mini2440.o3、復制驅動文件mini2440.c到drivers/mtd/maps目錄下(二) .配置編譯內核# make menuconfig以下內容必選:Memory Technology Devices(MTD)-Memory Technology Device (MTD) support*MTD partitioning supportDirect char device access to MTD devicesCaching block device access to MTD devicesRAM/ROM/Flash chi

25、p drivers-Detect flash chips by Common Flash Interface (CFI) probeSupport for Inter/Sharp flash chipsSupportfor AMD/Fujitsu/Spansion flash chipsCFI flash device mapped on mini2440下列內容(在flash上架fat16/fat32/ntfs/ext2等文件系統(tǒng)時才需要選上)不要選,否則會出現加載驅動模塊時會出現ftl_cs:FTL header not found.DeviceDrivers -Memory Techno

26、logy Devices (MTD) -FTL (Flash Translation Layer) support NFTL(NAND Flash Translation Layer) supportINFTL(Inverse NAND Flash Translation Layer) support(三).根據edb7312單板的norflash驅動(linux/mtd/maps/edb7312.c)來寫mini2440的norflash驅動代碼在mini2440.c中(帶詳細注釋)/*支持單板:mini2440*支持內核:3.1.2版本*模仿驅動:/linux/drivers/mtd/ma

27、ps/edb7312.c*/#include #include #include #include #include #include #include #include #define WINDOW_ADDR 0x /* NOR FLASH物理地址 */#define WINDOW_SIZE 0x /* NOR FLASH大小 */#define BUSWIDTH 2 /*估計是2Byte*/* 探測的接口類型,可以是cfi_probe, jedec_probe, map_rom, NULL ; */#define PROBETYPES cfi_probe, NULL #define MSG

28、_PREFIX MINI2440-NOR: /*printk的前綴 */#define MTDID mini2440-nor /*MTD驅動*/static struct mtd_info *mymtd;/*定義一個map_info,代表一塊norflash*/struct map_info mini2440nor_map =.name = NOR flash on MINI2440,.size = WINDOW_SIZE,.bankwidth = BUSWIDTH,.phys = WINDOW_ADDR,;/* 默認分區(qū)信息*/static struct mtd_partition stat

29、ic_partitions3 =.name = bootloader,.size = 0x40000,/256K.offset = 0,.name = Kernel,.size = 0x,/1M.offset = 0x40000,.name = RootFS,.size = 0xC0000,/768K.offset = 0x,;static const char *probes = NULL;static int mtd_parts_nb = 0;static struct mtd_partition *mtd_parts = 0;/*Norflash模型初始化函數*物理地址映射為虛擬地址:

30、mini2440nor_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);*探測norflash芯片,得到map_info:do_map_probe(); /應該是mtd_info,而不是map_info,轉載者注釋*探測分區(qū)信息,得到mtd_partition:parse_mtd_partitions();*利用map_info和mtd_partition注冊設備:mtd_device_register();/應該是mtd_info,而不是map_info,轉載者注釋*/int _init init_mini2440nor(void)static co

31、nst char *rom_probe_types = PROBETYPES;const char *type;const char *part_type = 0;printk(KERN_NOTICE MSG_PREFIX 0x%08x at 0x%08xn, WINDOW_SIZE, WINDOW_ADDR);/*物理地址映射為虛擬地址*/mini2440nor_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);if (!mini2440nor_map.virt)printk(MSG_PREFIX failed to ioremapn);return

32、-EIO;simple_map_init(&mini2440nor_map);mymtd = 0;type = rom_probe_types;for (; !mymtd & *type; type+)/*根據map_info探測norflash芯片,若成功則返回mtd_info*/mymtd = do_map_probe(*type, &mini2440nor_map);if (mymtd)mymtd-owner = THIS_MODULE;/*探測分區(qū)信息,若探測成功,則mtd_parts中保存了分區(qū)信息;若探測失敗,使用數組定義的默認分區(qū)信息*/mtd_parts_nb = parse_

33、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_NOTICE MSG_PREFIX no partition info availablen);elseprintk(KERN

34、_NOTICE MSG_PREFIX using %s partition definitionn,part_type);/*注冊設備*/mtd_device_register(mymtd, NULL, 0);mtd_device_register(mymtd, mtd_parts, mtd_parts_nb);return 0;iounmap(void *)mini2440nor_map.virt);return -ENXIO;/*Norflash模塊卸載函數*注銷設備:mtd_device_unregister();*銷毀map_info:map_destroy();*取消映射:iounm

35、ap();*/static void _exit cleanup_mini2440nor(void)if (mymtd)/*注銷設備*/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);M

36、ODULE_AUTHOR(WeiDong Wu );MODULE_DESCRIPTION(Generic configurable MTD map driver);實驗三、嵌入式linux驅動實驗3.1、實驗目的1) 安裝linux-2.6.382) 讓Makefile中的路徑與linux-2.6.38保持一致。3) 修改驅動.c文件,使得用pc0來控制紅燈。4) 通過交叉編譯器進行交叉編譯生成可執(zhí)行文件5) 通過tftp傳送文件。6) 實現驅動的加載和卸載。3.2、實驗原理1)工作原理框圖2)工作原理 根據上圖通過編寫驅動程序可以控制pc0接口,當它高電平時,D9led燈熄滅;當它低電平時,

37、D9led燈點亮。在編寫適當的應用程序完成實驗。3.3、參考程序1、 Led_app.c(應用程序) #include #include #include #include #include #include #include #include #include #include #define LED_DEVICE /dev/led_cugb#define LED_ON 0#define LED_OFF 1static unsigned char buf_wr10=0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99;static unsigne

38、d char buf_rd10;int main() int fd; int val=-1;int i,ret; if( (fd = open(LED_DEVICE,O_RDWR) 0 ) printf(open device error!rn); exit(1); while(1) printf(0:LED ON,1:LED OFF,2:Write test,3:Read test,4:quitrn); scanf(%d,&val); switch(val)case 0:ioctl(fd,LED_ON,0);break;case 1:ioctl(fd,LED_OFF,0);break;cas

39、e 2:ret = write(fd,buf_wr,sizeof(buf_wr);if(ret = 0)printf(app: read %d bytes:,ret);for(i=0;iret;i+)printf(0x%02x ,buf_rdi);printf(rn);elseprintf(Read error!rn);break;case 4:close(fd); exit(1);break;default:printf(input error!rn); 2、 led_drv.c(驅動.c)#include #include #include #include #include #inclu

40、de #include #include #include #include #include #include MODULE_LICENSE(GPL);MODULE_AUTHOR(Mr.Zeng);MODULE_VERSION(V1.0);MODULE_DESCRIPTION(Led Driver for AT91RM9200);#define LED_MAJOR231 #define DEVICE_NAME led_cugb#define LED_ON 0#define LED_OFF 1#define BUF_SIZE 64static unsigned char g_bufBUF_SI

41、ZE;static int led_open(struct inode *inode,struct file *filp) int minor,i; minor = MINOR(inode-i_rdev); at91_set_gpio_output(AT91_PIN_PC2,1); for(i=0;i BUF_SIZE)size_local = BUF_SIZE;copy_to_user(pbuf, g_buf, size_local); printk(driver: read %d bytesrn,size_local);printk(%s okrn,_FUNCTION_);return s

42、ize_local;static ssize_t led_write(struct file *filp, const char _user *pbuf, size_t Size, loff_t* other)int i;size_t size_local;size_local = Size;if(Size BUF_SIZE)size_local = BUF_SIZE;copy_from_user(g_buf,pbuf,size_local); printk(driver: write %d byte:,size_local);for(i=0;i.unlocked_ioctl .release = led_release,;static int _init led_init(void)int ret; ret = register_chrdev(LED_MAJOR ,DEVICE_NAME,&led_ctl_fops); if(ret Graphics support,修改為M,即編譯成模塊,保存退出后,make zImage編譯成內核鏡像2 把/up-techpxa270/exp/kernel/linux-2.6.9/drivers

溫馨提示

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

評論

0/150

提交評論