Linux驱动程序开发ppt课件_第1页
Linux驱动程序开发ppt课件_第2页
Linux驱动程序开发ppt课件_第3页
Linux驱动程序开发ppt课件_第4页
Linux驱动程序开发ppt课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1Linux驱动程序移植及分析程杰程杰aokikyongmailhi./aokikyon2Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.2 一、Linux内核启动过程概述 二、MTD简介及修正Nand MTD分区 三、移植YAFFS文件系统 四、Framebuffer驱动分析 五、嵌入式Linux 音频驱动程序设计 六、 Linux IIS音频运用程序开发简介3一、Linux内核启动过程

2、概述4Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.41 Linux内核启动内核启动 汇编代码部分 检测内核能否支持处置器和开发板 衔接内核运用的虚拟地址,设置页表,使能MMU 常规任务:复制数据段、调用strat_kernel函数 C代码部分 内核初始化 调用rest_init函数,创建系统第一个进程init 重设页表、设置系统时钟、初始化串口5Copyright 2009 Proch

3、ip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.5开场确定内核能否支持架构_lookup_processor_type确定内核能否支持开发板_lookup_machine_type建立一级页表_creat_page_tables制止Icache Dcache_arm720t_setup使能MMU_enale_mmu复制数据段清楚BSS段保管CPU ID调用start_kernel汇编阶段6Copyright 2009 Proch

4、ip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.6输出Linux版本信息printk设置与体系相关的内容setup_arch 初始化控制台console_init 启动init过程 rest_initC阶段7Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior

5、written consent.72 引导阶段代码分析引导阶段代码分析 78 ENTRY(stext) 79msrcpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC ensure svc mode 80 and irqs disabled 81 mrcp15, 0, r9, c0, c0 get processor id 82bl_lookup_processor_type r5=procinfo r9=cpuid 83movsr10, r5 invalid processor (r5=0)? 84beq_error_p yes, error p 85bl_lo

6、okup_machine_type r5=machinfo 86movsr8, r5 invalid machine (r5=0)? 87beq_error_a yes, error a 88bl_create_page_tables8Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.8 79 经过设置CPSR存放器来确保处置器进入SVC方式,并制止中断 81 读取协处置器CP15的存放器C

7、0获得CPU ID 82 调用函数确定能否支持CPU 85 调用函数确定能否支持当前开发板 假设_lookup_processor_type和_lookup_machine_type前往胜利,系统将调用_creat_page_tables来创建一级页表以建立虚拟地址到物理地址的映射关系,接着会调用_enable_mmu来翻开MMU9Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.93 st

8、art_kernel函数分析函数分析 进入start_kernel后,假设在串口中看不到信息,阐明启动出现问题,能够缘由有两个: bootloader传入参数不对 setup_arch针对开发板的设置不正确 在执行console_init函数前,系统信息保管在缓冲区中,只需在初始化控制台后才会输出10Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.101setup_arch函数分析函数分析

9、 arch/arm/kernel/setup.c void _init setup_arch(char *cmdline_p) setup_processor();mdesc = setup_machine(machine_arch_type);if (mdesc-boot_params)tags = phys_to_virt(mdesc-boot_params);if (tags-hdr.tag = ATAG_CORE) if (meminfo.nr_banks != 0)squash_mem_tags(tags);parse_tags(tags);memcpy(saved_command_

10、line, from, COMMAND_LINE_SIZE);saved_command_lineCOMMAND_LINE_SIZE-1 = 0;parse_cmdline(cmdline_p, from);paging_init(&meminfo, mdesc);11Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.11 setup_processor 用来进展处置器相关的一些设置

11、。 setup_machine用来获得开发板的machine_desc构造 if(mdesc-boot_params)用来确定u-boot传入参数的启动地址 之后的每一个tag,在setup.c中都定义了相应的处置函数 eg 内存tag:parse_tag_mem32 命令行tag:parse_tag_cmdline parse_cmdline对一些参数进展先期处置12Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior wr

12、itten consent.12 “mem= 用来限制Linux运用的内存总量 系统将调用early_mem对其进展处置 “console= 用来指定要运用的控制台称号、序号、参数 console_setup函数将处置这个信息,并保管在全局构造console_cmdline中,后面console_init函数初始化控制台时会根据这些信息选择13Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent

13、.132paging_init函数分析函数分析 调用方式: paging_init(&meminfo,mdesc); 其中: meminfo中存放内存信息 mdesc是开发板定义参数构造体 调用流程: paging_init - devicemapes_init - map_io14Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.143console_init函数分析函数分析 位置

14、 drivers/char/tty_io.c void _init console_init(void) initcall_t *call;/* Setup the default TTY line discipline. */(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY); #ifdef CONFIG_EARLY_PRINTKdisable_early_printk(); #endifcall = _con_initcall_start;while (call setup_arch-setup_processorsetup_mac

15、hinepage_tagsparse_cmdlinepaging_init -devicemaps_init - mdesc-map_io() console_init -register_console()16二、MTD简介及修正Nand MTD分区17Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.171 MTD简介简介 MTD(memory technology device内存技术

16、设备)是用于访问memory设备ROM、flash的Linux的子系统。 MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个笼统的接口。 MTD的一切源代码在/drivers/mtd子目录下。 CFI接口的MTD设备分为四层,从上到下依次是: 设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 18Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent

17、.181.1 Flash硬件驱动层硬件驱动层 硬件驱动层担任在init时驱动Flash硬件,Linux MTD设备的NORFlash芯片驱动遵照CFI接口规范,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序那么位于/drivers/mtd/nand子目录下19Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.191.2 MTD原始设备原始设备 原始设

18、备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。 用于描画MTD原始设备的数据构造是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。 mtd_tablemtdcore.c那么是一切MTD原始设备的列表 mtd_partmtd_part.c是用于表示MTD原始设备分区的构造,其中包含了mtd_info,由于每一个分区都是被看成一个MTD原始设备加在mtd_table中的20Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be repro

19、duced by any means without prior written consent.201.3 MTD设备层设备层 基于MTD原始设备,linux系统可以定义出MTD的块设备主设备号31和字符设备设备号90。 MTD字符设备的定义在mtdchar.c中实现,经过注册一系列file operation函数lseek、open、close、read、write。 MTD块设备那么是定义了一个描画MTD块设备的构造 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。 21Copy

20、right 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.211.4文件系统文件系统 在Bootloader中将JFFS或JFFS2的文件系统映像jffs.image或jffs2.img烧到flash的某一个分区中,在/arch/arm/mach-your/arch.c文件的 your_fixup函数中将该分区作为根文件系统挂载。 文件系统:内核启动后,经过mount 命令可以将flash中的其他分区作为文

21、件系统挂载到mountpoint上。22Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.222 修正修正Nand MTD分区分区 SEP4020 Nand Flash 有64MB空间 目前分区情况: mtdblock0 0 x00000000-0 x0100000 1M mtdblock1 0 x00100000-0 x0600000 5M mtdblock2 0 x00600000-0

22、x1E00000 24M mtdblock3 0 x01E00000-0 x04000000 34M23Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.23 SEP4020 NAND的驱动程序,其目录位于: ./drivers/mtd/nand/sep4020.c 宏定义: #define NUM_PARTITIONS 4 /NAND的分区数目(这里分为4个分区) #define UBOO

23、T_SIZE SZ_1M*1 /UBOOT分区空间大小#define KERNEL_SIZE SZ_1M*5 /内核分区空间大小#define ROOT_SIZE SZ_1M*24 /根文件系统分区大小#define USER_SIZE SZ_1M*34 /用户空间分区大小 24Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.24 static struct mtd_partition p

24、artition_info = .name = U-boot, .offset = 0, .size = UBOOT_SIZE , .name = linux 2.6.16 kernel, .offset = UBOOT_SIZE, .size = KERNEL_SIZE , .name = root, .offset = UBOOT_SIZE+KERNEL_SIZE, .size = ROOT_SIZE , .name = user, .offset = UBOOT_SIZE+KERNEL_SIZE+ROOT_SIZE, .size = USER_SIZE ; 25Copyright 200

25、9 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.25 上面的代码可以看出:NAND被分为4个分区 我们能够修正NAND分区数目和各分区的大小(包括添加分区删除分区合并分区等) 留意:无论做任何修正,一切分区的大小不能超越NAND的总量(目前64M). 26Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reprodu

26、ced by any means without prior written consent.26添加一个分区添加一个分区 #define NUM_PARTITIONS 5 /NAND的分区数目(修正)#define UBOOT_SIZE SZ_1M*1 /UBOOT分区空间大小#define KERNEL_SIZE SZ_1M*5 /内核分区空间大小#define ROOT_SIZE SZ_1M*24 /根文件系统分区大小#define USER_SIZE SZ_1M*17 /用户空间分区大小(修正)#define USER1_SIZE SZ_1M*17 /用户添加的分区(修正) 27Cop

27、yright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.27 这样就将原来的第四分区(34M)分为两个分区(17M+17M)的空间.在串口调试工具输出的NAND分区信息中可以看到如下五个分区:Creating 5 MTD partitions on NAND 64MiB 3,3V 8-bit:0 x00000000-0 x00100000 : U-boot0 x00100000-0 x00600000

28、: linux 2.6.16 kernel0 x00600000-0 x01e00000 : root0 x01e00000-0 x02f00000 : user0 x02f00000-0 x04000000 : user1 28Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.28删除删除(合并合并)一个分区一个分区 #define NUM_PARTITIONS 3 /NAND分区数目(修

29、正)#define UBOOT_SIZE SZ_1M*1#define KERNEL_SIZE SZ_1M*5#define ROOT_SIZE SZ_1M*58 /根目录空间大小(修正)static struct mtd_partition partition_info = .name = U-boot, .offset = 0, .size = UBOOT_SIZE , .name = linux 2.6.16 kernel, .offset = UBOOT_SIZE, .size = KERNEL_SIZE , .name = root, .offset = UBOOT_SIZE+KER

30、NEL_SIZE, .size = ROOT_SIZE ,; 29Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.29 这样就将原来的后两个分区就合并成为一个54M空间的分区.在串口调试工具输出的NAND分区信息中可以看到如下三个分区:Creating 3 MTD partitions on NAND 64MiB 3,3V 8-bit:0 x00000000-0 x00100000 : U

31、-boot0 x00100000-0 x00600000 : linux 2.6.16 kernel0 x00600000-0 x04000000 : root 30Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.30 static struct mtd_partition partition_info = .name = U-boot, .offset = 0, .size = UBOO

32、T_SIZE , .name = linux 2.6.16 kernel, .offset = UBOOT_SIZE, .size = KERNEL_SIZE , .name = root, .offset = UBOOT_SIZE+KERNEL_SIZE, .size = ROOT_SIZE , .name = user, .offset = UBOOT_SIZE+KERNEL_SIZE+ROOT_SIZE, .size = USER_SIZE ,/以下分区为添加的一个分区,在地偏移量后面要加上USER空间的大小 .name = user1, .offset = UBOOT_SIZE+KER

33、NEL_SIZE+ROOT_SIZE+USER_SIZE, .size = USER1_SIZE ;31三、移植YAFFS文件系统32Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.321.1 简介简介 YaffsYet Another Flash File System文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于Y

34、AFFS2可以更好的支持大容量的NAND FLASH芯片。 Yaffs文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR FLASH的运用场所设计的,而NOR FLASH和NAND FLASH本质上有较大的区别,所以虽然JFFS1/2 文件系统也能运用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。33Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced

35、by any means without prior written consent.33NOR和和NAND的比较的比较 根本上NOR比较适宜存储程序代码,其容量普通较小比如小于32MB,价钱较高,而NAND容量可达1GB以上,价钱也相对廉价,适宜存储数据。普通来说,128MB以下容量NAND FLASH 芯片的一页大小为528字节,用来存放数据,另外每一页还有16字节的备用空间SpareData,OOB,用来存储ECC校验/坏块标志等信息,再由假设干页组成一个块,通常一块为32页16K。 与NOR相比,NAND不是完全可靠的,每块芯片出厂时都有一定比例的坏块存在,对数据的存取不是运用地址映射

36、而是经过存放器的操作,串行存取数据。 34Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.341.2 Yaffs文件系统数据在文件系统数据在NAND上的存储方式上的存储方式 Yaffs对文件系统上的一切内容比如正常文件,目录,链接,设备文件等等都一致当作文件来处置,每个文件都有一个页面专门存放文件头,文件头保管了文件的方式、一切者id、组id、长度、文件名、Parent Object ID

37、等信息。由于需求在一页内放下这些内容,所以对文件名的长度,符号链接对象的途径名等长度都有限制。 前面说到对于NAND FLASH上的每一页数据,都有额外的空间用来存储附加信息,Yaffs正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。35Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.35 以512+16B为一个PAGE的NAND FLASH芯片为例,Yaffs文件系统数据的存储

38、规划如下所示 0.511数据区域512.515YAFFS TAG516Data status byte517Block status byte 坏块标志位518.519YAFFS TAG520.522后256字节数据的ECC校验结果523.524YAFFS TAG525.527前256字节数据的ECC校验结果36Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.36BitsContent20

39、ChunkID,该page在一个文件内的索引号,所以文件大小被限制在220 PAGE 即512Mb22 bits serial number10ByteCount 该page内的有效字节数18ObjectID 对象ID号,用来唯一标示一个文件12Ecc, Yaffs_Tags本身的ECC校验和2Unused可以看到在这里YAFFS一共运用了8个BYTE用来存放文件系统相关的信息yaffs_Tags。这8个Byte的详细运用情况按顺序如下: 37Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be re

40、produced by any means without prior written consent.37 Serial Number在文件系统创建时都为0,以后每次写具有同一ObjectID和ChunkID的page的时候都加一,由于Yaffs在更新一个PAGE的时候总是在一个新的物理Page上写入数据,再将原先的物理Page删除,所以该serial number可以在断电等特殊情况下,当新的page曾经写入但老的page还没有被删除的时候用来识别正确的Page,保证数据的正确性。 ObjectID号为18bit,所以文件的总数限制在256K即26万个左右。 以上这些是针对Yaffs1而言

41、,对于Yaffs2由于针对chunk size大于1k的NAND FLASH,在Tags各分量及总体尺寸上都做了修正,以便更快更好的处置大容量的NAND FLASH芯片。由于Tag尺寸的增大,在512+16B类型的NAND FLASH上就一个Trunk对应一个page的情况,目前就无法运用Yaffs2文件系统了。 由于文件系统的根本组织信息保管在页面的备份空间中,因此,在文件系统加载时只需求扫描各个页面的备份空间,即可建立起整个文件系统的构造,而不需求像JFFS1/2 那样扫描整个介质,从而大大加快了文件系统的加载速度。 38Copyright 2009 Prochip Electronics

42、 Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.381.3 yaffs文件系统在内存中的组织方式文件系统在内存中的组织方式 操作文件系统的第一步自然是获得SuperBlock了,Yaffs文件系统本身在NAND Flash上并不存在所谓的SuperBlock块,完全是在文件系统mount的过程中由read_super函数填充的. 通常一个详细的文件系统在VFS的Super_block构造中除了通用的数据外,还有本人公用的数据,Yaffs文件系统的公用数据是

43、一个yaffs_DeviceStruct构造,主要用来存储一些相关软硬件配置信息,相关函数指针和统计信息等。 39Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.39SuperBlock File system type Size Status Information about other metadata structures 40Copyright 2009 Prochip Elec

44、tronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.40文件在内存中的组织方式文件在内存中的组织方式 在mount过程执行read_super的过程中,Yaffs文件系统还需求将文件系统的目录构造在内存中建立起来。由于没有super块,所以需求扫描Yaffs分区,根据从OOB中读取出的yaffs_tags信息判别出是文件头page还是数据page。再根据文件头page中的内容以及数据page中的ObjectID/ChunkID/serial Nu

45、mber等信息在内存中为每个文件Object建立一个对应的yaffs_object对象。 41Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.41yaffs_object构造构造 如修正时间,用户ID,组ID等文件属性; 用作yaffs文件系统维护用的各种标志位如脏dirty标志,删除标志等等; 用作组织构造的,如指向父目录的Parent指针,指向同级目录中其他对象链表的siblings双

46、向链表头构造42Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.42Yaffs_object中有其各自专有的数据内容中有其各自专有的数据内容 普通文件:文件尺寸,用于快速查找文件数据块的yaffs_Tnode 树的指针等 目录:目录项内容双向链表头children 链接:softlink的alias,hardlink对应的ObjectID 经过创建这些yaffs_object,yaffs文

47、件系统就可以将存储在NAND FLASH上数据系统的组织起来,在内存中维护一个完好的文件系统构造。 43Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.432 Yaffs文件系统集成及运用相关文件系统集成及运用相关 这里所谓移植,就是在特定的软硬件环境里编译出yaffs文件系统模块: 在内核中建立YAFFS目录fs/yaffs,并把下载的YAFFS代码复制到该目录下面。 修正Kconfig

48、文件,参与yaffs目录 修正fs/makefile,参与yaffs目录44Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.442.1 配置、编译内核配置、编译内核 讲解用到的几个选项: CONFIG_YAFFS_FS:支持YAFFS文件系统 CONFIG_YAFFS_YAFFS1:支持YAFFS1文件系统,特别运用于每页大小为512Byte的Nand Flash上 CONFIG_YAFF

49、S_YAFFS2:支持YAFFS2文件系统,对于每页大小为2048Byte的Nand Flash,这是必需的 CONFIG_YAFFS_DOES_ECC:运用YAFFS本身的ECC校验函数45Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.45 Turn off debug chunk erase check,这一项实验的结果选上后平均可以提高20-30%左右的擦写速度 最好把Lets Y

50、affs do its own ECC选上,同时,把MTD NAND驱动中的ECC校验封锁。 46Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.462.2 Yaffs文件系统的制造和运用文件系统的制造和运用 Yaffs源代码包的utils目录下包含了mkyaffsimage 和mkyaffs2image的代码,简单的修正一下Makefile里的内核途径就能编译出mkyaffsimage/

51、mkyaffs2image工具。 运转mkyaffsimage dir imagename可以制造出yaffs1文件系统的镜像。 但是,需求留意的是,制造出来的yaffs image文件与通常的文件系统的image文件不同,由于在image文件里除了以512字节为单位的一个page的data数据外,同时紧跟在后还包括了16字节为单位的NAND备份数据区OOB的数据。所以实践上是以528个字节为单位的。就是由于包含了这额外的16字节/page的数据,所以根本上常规方法如dd,或者通常的下载其它类型image的工具就无法正常下载yaffs image了,需求修正他所运用的下载工具的代码,使得它能将

52、yaffs image中的这些额外数据也写入NAND FLASH OOB中。47Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.47 需求留意 经过mkyaffsimage制做出来的image其OOB中也包含它本人计算的ECC校验数据,其校验算法有能够和MTD NAND驱动的校验算法不同,假设在内核中由MTD来处置ECC,会呵斥MTD以为一切的page都校验错误。所以,最好把Lets Ya

53、ffs do its own ECC选上,同时,把MTD NAND驱动中的ECC校验封锁。 48Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.48其它方式制造其它方式制造yaffs文件系统文件系统 假设不思索产线批量下载的话,也可以经过mount拷贝的方式预备yaffs文件系统。用flash_eraseall将NAND FLASH分区擦除,然后做为yaffs分区直接mount上来,将文件

54、系统的内容拷贝上去就可以了。这能够是在真正的NAND FLASH上实验yaffs文件系统最简单的方式了。 49四、Linux Framebuffer驱动设计Aokikyon50Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.50概述概述 Linux操作系统,运用程序处于用户态,无法直接对LCD进展读写 在Linux系统中,Framebuffer驱动提供了用户和LCD屏幕之间的接口功能 Fr

55、amebuffer将显示设备笼统为内存缓冲区 用户经过对内存的读写,可控制LCD输出51Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.51Framebuffer原理原理 必需运用Linux笼统出来的Framebuffer设备对LCD进展读写 在DEV目录中普通命名为fb0、fb1 FB驱动提供ioctl接口函数,实现查询、修正显示设备的参数功能 Eg:图像的分辨率、像素位宽 52Copy

56、right 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.52FramebufferLinux用户LCD53Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.53Framebuffer设备驱动构造设备驱动

57、构造 驱动文件:linux/drivers/video/目录 fbmem.c:提供LCD驱动的通用文件接口 fbcon.c:提供控制台相关操作接口函数 fb.h:定义了主要数据构造 skeletonfb.c:演示了开发Framebuffer驱动程序的框架 54Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.54FB驱动重要数据构造驱动重要数据构造 struct fb_info 驱动最关键的

58、构造体,包含了设备属性和操作的完好描画 struct fb_ops 提供底层操作的函数的指针,其中几个重要函数需求驱动设计人员完成 55Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.55 struct fb_fix_screeninfo 填充用户不可修正的参数,包含识别符、显示类型、显示的颜色属性等 struct fb_var_screeninfo 填充用户可以修正的参数,包括屏幕分辨率

59、、每个像素的位宽、帧延时、行延时等 56Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.56 struct fb_fops Framebuffer属于字符设备,用户经过fb_fops构造中定义的文件操作接口函数可以操作Framebuffer设备,文件接口函数一致由fbmem.c实现,普通不需求驱动编写人员再次编写 57Copyright 2009 Prochip Electronics C

60、o,ltd. All Rights Reserved. Not to be reproduced by any means without prior written consent.57需求驱动设计人员完成的函数需求驱动设计人员完成的函数 fb_check_var() 检测输入参数的正确性,假设为硬件不支持的输出方式,那么报错 fb_set_par() 更新fb_var_screen构造体中的参数,用来更改硬件设置 58Copyright 2009 Prochip Electronics Co,ltd. All Rights Reserved. Not to be reproduced by any means without

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论