Linux驱动程序开发

上传人:xt****7 文档编号:181050290 上传时间:2023-01-09 格式:PPT 页数:112 大小:701KB
返回 下载 相关 举报
Linux驱动程序开发_第1页
第1页 / 共112页
Linux驱动程序开发_第2页
第2页 / 共112页
Linux驱动程序开发_第3页
第3页 / 共112页
点击查看更多>>
资源描述
1Linux驱动程序移植及分析程杰程杰http:/2Copyright 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内核启动过程概述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 Prochip 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 Prochip 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 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_lookup_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的寄存器C0获得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 start_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.10(1)setup_arch函数分析函数分析 arch/arm/kernel/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-=ATAG_CORE)if(!=0)squash_mem_tags(tags);parse_tags(tags);memcpy(saved_command_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()用来进行处理器相关的一些设置。setup_machine()用来获得开发板的machine_desc结构 if(mdesc-boot_params)用来确定u-boot传入参数的启动地址 之后的每一个tag,在中都定义了相应的处理函数 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 written 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(2)paging_init函数分析函数分析 调用形式:paging_init(&meminfo,mdesc);其中:meminfo中存放内存信息 mdesc是开发板定义参数结构体 调用流程:paging_init-devicemapes_init-map_io()14Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.14(3)console_init函数分析函数分析 位置 drivers/char/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_machinepage_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内存技术设备)是用于访问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.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原始设备原始设备 原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。mtd_table()则是所有MTD原始设备的列表 mtd_part()是用于表示MTD原始设备分区的结构,其中包含了mtd_info,因为每一个分区都是被看成一个MTD原始设备加在mtd_table中的20Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.201.3 MTD设备层设备层 基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。MTD字符设备的定义在中实现,通过注册一系列file operation函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。21Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.21文件系统文件系统 在Bootloader中将JFFS(或JFFS2)的文件系统映像(或)烧到flash的某一个分区中,在/arch/arm/mach-your/文件的 your_fixup函数中将该分区作为根文件系统挂载。文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到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 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的驱动程序,其目录位于:宏定义:#define NUM_PARTITIONS 4 /NAND的分区数目(这里分为4个分区)#define UBOOT_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 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+KERNEL_SIZE,.size=ROOT_SIZE ,.name=user,.offset=UBOOT_SIZE+KERNEL_SIZE+ROOT_SIZE,.size=USER_SIZE ;25Copyright 2009 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 reproduced 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 /用户增加的分区(修改)27Copyright 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: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分区数目(修改)#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+KERNEL_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-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=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 ,/以下分区为增加的一个分区,在地偏移量后面要加上USER空间的大小 .name=user1,.offset=UBOOT_SIZE+KERNEL_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 简介简介 Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的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 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不是完全可靠的,每块芯片出厂时都有一定比例的坏块存在,对数据的存取不是使用地址映射而是通过寄存器的操作,串行存取数据。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等信息。因为需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度都有限制。前面说到对于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文件系统数据的存储布局如下所示 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.36BitsContent20ChunkID,该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 reproduced 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而言,对于Yaffs2因为针对chunk size大于1k的NAND FLASH,在Tags各分量及总体尺寸上都做了修改,以便更快更好的处理大容量的NAND FLASH芯片。由于Tag尺寸的增大,在512+16B类型的NAND FLASH上就一个Trunk对应一个page的情况,目前就无法使用Yaffs2文件系统了。由于文件系统的基本组织信息保存在页面的备份空间中,因此,在文件系统加载时只需要扫描各个页面的备份空间,即可建立起整个文件系统的结构,而不需要像JFFS1/2 那样扫描整个介质,从而大大加快了文件系统的加载速度。38Copyright 2009 Prochip Electronics 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文件系统的专用数据是一个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 Electronics 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 Number等信息在内存中为每个文件(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双向链表头结构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文件系统就能够将存储在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文件,加入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_YAFFS_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 Yaffs 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/mkyaffs2image工具。运行mkyaffsimage dir imagename可以制作出yaffs1文件系统的镜像。但是,需要注意的是,制作出来的yaffs image文件与通常的文件系统的image文件不同,因为在image文件里除了以512字节为单位的一个page的data数据外,同时紧跟在后还包括了16字节为单位的NAND备份数据区(OOB)的数据。所以实际上是以528个字节为单位的。就是因为包含了这额外的16字节/page的数据,所以基本上常规办法如dd,或者通常的下载其它类型image的工具就无法正常下载yaffs image了,需要修改你所使用的下载工具的代码,使得它能将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 Yaffs 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上来,将文件系统的内容拷贝上去就可以了。这可能是在真正的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屏幕之间的接口功能 Framebuffer将显示设备抽象为内存缓冲区 用户通过对内存的读写,可控制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:图像的分辨率、像素位宽 52Copyright 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设备驱动结构设备驱动结构 驱动文件:linux/drivers/video/目录:提供LCD驱动的通用文件接口 :提供控制台相关操作接口函数 :定义了主要数据结构 :演示了开发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 驱动最关键的结构体,包含了设备属性和操作的完整描述 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 填充用户可以修改的参数,包括屏幕分辨率、每个像素的位宽、帧延时、行延时等 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设备,文件接口函数统一由实现,一般不需要驱动编写人员再次编写 57Copyright 2009 Prochip Electronics Co,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 prior written consent.58 fb_fillrect()在屏幕上填充矩形 fb_copyarea()区域复制函数 fb_imageblit()在屏幕上显示图片 init_LCD()初始化硬件寄存器 fb_probe()Framebuffer驱动初始化59Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.59SEP4020 Linux Framebuffer设备驱动实现设备驱动实现 1 修改linux/dirvers/video/kconfig文件,添加代码,并在编译内核时选上:config FB_SEP4020tristate SEP4020 LCD supportdepends on(FB=y)&ARM&select FB_CFB_FILLRECTselect FB_CFB_COPYAREAselect FB_CFB_IMAGEBLIT60Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.60 2 修改linux/dirvers/video/Makefile文件,添加代码:obj-$(CONFIG_FB_SEP4020)+=61Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.613 编写文件编写文件(只介绍主要部分只介绍主要部分)。/*填充fb_var_screeninfo结构体*/static struct fb_var_screeninfo sepfb_var=.xres=320,/实际x轴分辨率.yres=240,/实际y轴分辨率.xres_virtual=320,/虚拟x轴分辨率.yres_virtual=240,/虚拟y轴分辨率/*填充fb_fix_screeninfo结构体*/static struct fb_fix_screeninfo sepfb_fix=.id=“sep4020fb”,/设备名称.type=FB_TYPE_PACKED_PIXELS,/显示类型.visual=FB_VISUAL_TRUECOLOR,/显示颜色属性 62Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.62/*填充fb_ops*/static struct fb_ops sepfb_ops=.fb_check_var=sepfb_check_var,/检测参数函数.fb_set_par=sepfb_set_par,/设置参数函数.fb_fillrect=cfb_fillrect,/调用系统提供的函数.fb_copyarea=cfb_copyarea,/调用系统提供的函数.fb_imageblit=cfb_imagelbit,/调用系统提供的函数 63Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.63/*初始化SEP4020硬件寄存器*/static void init_sep_LCD(void)*(volatile unsigned long*)LCDC_LECR_V=0 x00000000;/禁LCDC*(volatile unsigned long*)LCDC_SSA_V=pVideoBuffer;/LCD数据起始地址*(volatile unsigned long*)LCDC_SIZE_V=YMAX|XMAX;*(volatile unsigned long*)LCDC_PCR_V=TFT|COLOR|PBSIZE|BPIX|PIXPOL|FLMPOL|LPPOL|CLKPOL|OEPOL|END_SEL|ACD_SEL|ACD|PCD;*(volatile unsigned long*)LCDC_HCR_V=H_WIDTH|H_WAIT_1|H_WAIT_2;*(volatile unsigned long*)LCDC_VCR_V=V_WIDTH|PASS_FRAME_WAIT|V_WAIT_1|V_WAIT_2;*(volatile unsigned long*)LCDC_PWMR_V=SCR|CC_EN|PW;*(volatile unsigned long*)LCDC_DMACR_V=BL|HM|TM;*(volatile unsigned long*)LCDC_LECR_V=0 x00000001;/使能LCDC*(volatile unsigned long*)LCDC_LCDISR_V=0 x00000000;64Copyright 2009 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.64/*Framebuffer初始化函数*/static int _init sep4020fb
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!