Linux驱动开发培训7

上传人:痛*** 文档编号:242500534 上传时间:2024-08-25 格式:PPTX 页数:86 大小:1.08MB
返回 下载 相关 举报
Linux驱动开发培训7_第1页
第1页 / 共86页
Linux驱动开发培训7_第2页
第2页 / 共86页
Linux驱动开发培训7_第3页
第3页 / 共86页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,*,远见品质,The successs road,ARM linux开发流程,主要内容:,ARM体系结构,ARM linux 概述,ARM linux 开发平台搭建,ARM linux bootloader开发,ARM linux 内核开发,ARM linux 文件系统,ARM体系结构,ARM处理器结构,ARM系统发展趋势,ARM体系结构,ARM编程模型,数据类型,处理器模式,寄存器组织,异常,存储器映射,ARM寻址方式,ARM处理器结构,ARM系统发展趋势,ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。具有性能高、成本低和能耗省的特点。,ARM当前有个产品系列:,ARM7、ARM9、ARM9E、ARM10、,ARM11、SecurCore,变种:StrongARM、Xscale,ARM处理器结构,ARM体系结构,ARM基于精简指令集(RISC),通常具有两套套指令集,高性能32位ARM指令集,高代码密度16位Thumb指令集(操作码,有些指令不要操作数),Thumb在位体系结构上实现了位指令集,提供:,比位更高的性能;(寻址空间,访问速度),比位更高的代码密度(处理非数据指令),ARM处理器结构,数据类型,Byte8位,Halfword16位,Word32位,处理器模式,user用户,正常程序执行模式,FiqFIQ,高速数据传送活通道处理,IrqIRQ,通用中断处理,Svc管理,操作系统保护模式,Abt中止,虚拟存储器或存储器保护,Und未定义,硬件协处理器软件仿真,Sys系统,特权操作系统任务,ARM编程模型,ARM编程模型,寄存器组织,ARM处理器总共有37个寄存器,31个通用寄存器(32位有效),不分组寄存器R0R7,分组寄存器 R8R14,程序计数器 R15,个状态寄存器(12位有效),在所有模式下都可以访问当前程序状态寄存器CPSR(Current Program Status),ARM编程模型,ARM编程模型,ARM编程模型,异常,ARM编程模型,存储器映射,地址空间,存储器格式,大端存储系统,小端存储系统,非对准存储器访问,非对准取指结果不可预知,非对准数据访问按体系决定,忽略低地址,预取指 (流水线),存储器映射 I/O,ARM系统完成I/O功能的标准做法是使用存储器映射I/O,ARM编程模型,ARM编程模型,ARM寻址方式,寄存器寻址,ADD R0,R1,R2;R0,R1+R2,立即寻址,ADD R3,R3#1;R3,R3+1,寄存器移位寻址,ADD R3,R2,R1,LSL #3 ;R3,R2+8xR1,寄存器间接寻址,LDR R0,R1;R0,R1,变址寻址,LDR R0,R1,#4;R0,R1+4,ARM寻址方式,多寄存器寻址,LDMIA R1,R0,R2,R5 ;R0,R1,;R2R1+4,; R5R1+8,堆栈寻址,块拷贝寻址,LDMIA R0!,R2-R9,STMIA R1,R2-R9,相对寻址,BL SUBR;转移到SUBR,ARM linux 概述,嵌入式 Linux 的发展,嵌入式 Linux 的组成,ARM Linux 概况,ARM Linux patch文件的使用,嵌入式 Linux 的发展,发展历史,1992年底,linux 1.0问世,90年代末,出现了RT-Linux、RTAI、(任务调度10MS满足)QT/Embedded等开源项目,2000年,基于嵌入式Linux的网络产品逐渐兴起,2001年,一批专业嵌入式Linux解决方案商涌现,Montavista、Lineo、Mizi等,2002年,基于嵌入式Linux的PDA面世,嵌入式 Linux 的发展,嵌入式Linux 的基本需求,实时性能: RT-Linux、RTAI,高可靠性:内核不断完善,升级,较低功耗:电源管理,快速启动:bootloader、kernel,体积小巧: Flash、Ram等资源占用,移植性强: 灵活方便的移植到其他平台,嵌入式 Linux 的组成,嵌入式 Linux 的三要素:,BootLoader,系统引导、调试、烧写,内核 KERNEL,Linux kernel + patch,根文件系统,定制的应用程序,嵌入式 Linux 的组成,Linux 系统核心框图,Linux 系统支持硬件类型,字符设备,块设备,网络设备,用户级进程,系统调用接口,硬件驱动,物理硬件,进程控制系统,进程通信,虚拟文件系统,EXT2,NFS,其他,网络协议,内存管理,进程调度,ARM Linux 概况,ARM Linux patch文件的使用,ARM Linux 是以patch的方式发布的,,需要在原linux基本内核基础上打patch,举例说明:,bash$ tar zxvf linux-2.4.18.tar.gz,bash$ cd linux-2.4.18,bash$ zcat ./patch-2.4.18-rmk7.gz | patch -p1,bash$ zcat ./diff-2.4.18-rmk7-pxa1.gz | patch -p1,bash$ zcat ./diff-2.4.18-rmk7-pxa1-mz4. gz | patch -p1,ARM linux 开发平台搭建,跨平台开发模式,交叉编译工具链,主机端系统配置,开发所需工具,跨平台开发模式,跨平台开发与我们平时的编程有何不同,绝大多数的软件开发都是以native方式进行的,即本机(HOST)开发、调试,本机运行的方式,嵌入式系统的软件开发采用一种交叉编译调试,编译生成的代码不能在开发主机上运行,需要,传输到板子上运行,跨平台开发模式,交叉编译调试环境建立在宿主机上,,对应的开发板叫做目标板。,如下图所示:,【宿主机】 【目标板】,交叉编译工具链,交叉编译工具链的组成,如何生成自己的交叉编译工具链,交叉编译工具链的安装,交叉编译工具链,交叉编译工具链的组成,Binutils软件包,汇编器和连接器,GCC软件包,GCC 软件包包含 GNU 编译器,其中有C和C+编译器.,Glibc软件包,Glibc 是提供系统调用和基本函数的 C 库,一般说来安装了上述软件包后,一个基本的开发工具链已经建立,交叉编译工具链,交叉编译工具链,下面简单列出各个步骤,编译安装 Binutils - 第一遍,非常重要,因为 Glibc 和 GCC 会针对可用的连接器和汇编器进行多种测试,以决定打开某些特性,编译安装 GCC - 第一遍,这里我们不需要C+编译器,所以我们这里只解压 gcc-core 包,安装 Linux 头文件,包含系统相关信息,编译安装 Glibc,提供系统调用和基本函数的 C 库,编译安装Gcc - 第二遍,编译安装 Binutils - 第二遍,重新编译GCC和Binutils,连接到新的Glibc上,交叉编译工具链,交叉编译工具链,交叉编译工具链的安装,以Mizi开发板为例,Mizi交叉编译工具以RPM包方式发布,并包含,了一些常用的库文件,如果选择mizi的2410TK的SDK里的交叉工具,链,则gcc版本为2.95.2,如果选择了mizi2.0的,则gcc版本为2.95.3,rpm -ivh -force -nodeps *.rpm,开发所用工具安装到/opt/host/armv4l下,主机端系统配置,检测并口是否工作正常;,检测串口是否工作正常,运行MINICOM,将串口配置;,为115200,8-N-1方式,#minicom s,启动NFS服务,设置输出路径;,编辑/etc/exports文件,在里面加入如下一句话:,/nfsroot xxx.xxx.xxx.xxx(rw),启动TFTP服务,通过运行SETUP命令;,取消IPTABLES防火墙的启动运行;,#chkconfig level 3 iptables off,上面两个设置也可以通过图形界面,在系统菜单里的,服务里面进行选择配置,详细过程这里就不多讲述。,开发所需工具,仿真器,如MULTI-ICE;,简易JTAG,可以用来烧写Bootloader;,交叉串口线,23交叉;,交叉网线,主机对联线;,USB扁平线, 系统烧写;,仿真软件,ADS,SDT。,ARM linux bootloader开发,Bootloader的主要功能,ARM linux Bootloader的启动步骤,内核启动参数表,几种常见的ARM linux Bootloader,Bootloader的主要功能,基本功能,引导操作系统,初级调试功能,下载与烧写,附加功能,系统自检,系统升级,参数设置,ARM linux Bootloader的启动步骤,一个最小需求的bootloader启动步骤,配置CPU、内存系统、FLASH及中断,装载内核到指定内存区域,装载initial RAM disk到指定内存区域,初始化内核启动参数,获取ARM Linux 机器类型,设置正确的寄存器值,并启动内核,附加步骤,判定ARM 系统状态(SLEEP模式),初始化串口、网口、VIDEO等设备,内核启动参数表,Bootloader传递的内核参数内容,内存容量大小,内核启动命令行参数,Init ram disk的位置及大小,其他必要参数(显示及音频设置、版本信息等),参数表由许多项组成,须遵循以下原则:,参数表存贮在RAM的区域不能与 kernel 及initrd位置冲突,,推荐在RAM的前16KiB,,通常,在RAM起始的 0x100偏移处,最前面是中断向量表,在内核启动前,将参数表位置把参数表位置固定在RAM的0x100偏移处.,参数表不能超越RAM的 0x4000 偏移处,内核初始化转换表,在那里,如果不按上述推荐位置,那么参数表位置要字对齐,参数表必须以 ATAG_CORE项起始,以 ATAG_NONE结束,参数表至少包含 ATAG_MEM项,关于参数表信息可查看内核代码include/asm/setup.h,内核启动参数表,内核中参数表定义:,struct tag ,struct tag_header hdr;,union ,struct tag_corecore;,struct tag_mem32mem;,struct tag_videotextvideotext;,struct tag_ramdiskramdisk;,struct tag_initrdinitrd;,struct tag_serialnrserialnr;,struct tag_revisionrevision;,struct tag_videolfbvideolfb;,struct tag_cmdlinecmdline;, u;,;,几种常见的ARM linux Bootloader,ARM linux 内核开发,ARM Linux 内核原码树结构,ARM Linux 内核image结构,Linux 地址空间管理,Linux 设备驱动程序开发,Linux 下驱动加载方式,驱动原码分析,ARM linux 内核原码树结构,ARM linux 内核image结构,内核发展至2.4版本以后,体积足见庞大,为节省空间,采用压缩内核zImage,ARM linux最早基于2.4版本开发,因此我们有必要分析一下我们生成的压缩内核的结构,zImage头代码解析,注:地址是相对于zImage的偏移位置,Linux 地址空间管理,Linux 是一个使用虚拟内存的系统,这意味着用户程序看到的地址不是直接对应于硬件使用的物理地址。虚拟内存提出了一个间接的层,这对许多事情都是有利的。如果有虚拟内存,运行在系统上的程序就可以分配到比可用物理内存更多的内存。甚至一个单独的进程都可以拥有比系统的物理内存更大的虚拟地址空间,虚拟内存也能在进程地址空间上使用很多技巧,包括映射设备的内存。,Linux 地址空间管理,虚拟空间映射的实现手段,初始化时映射,使用时映射,Linux设备驱动程序开发,Linux 设备驱动程序分类,Linux 设备驱动程序基本框架,编写 Linux 驱动程序几点注意事项,Linux 设备驱动程序调试技术,Linux 设备驱动程序分类,字符设备,支持面向字符的I/O操作,负责管理自己的缓冲区结构,顺序存取功能,块设备,仅支持面向块的I/O操作,所有I/O操作都通过在内核地址空间中的I/O缓冲区进行,随机存取功能:支持几乎任意长度和任意位置上的I/O请求,网络设备,Linux 设备驱动程序基本框架,驱动入口,初始化函数xxx_init,:,向OS注册及硬件初始化,包括中断及bank设置、GPIO设置等,主体代码 struct file_operation,设备基本操作函数,inode结构体,提供关于设备节点文件/dev/xxx的信息,时间流,HZ,、,jiffies,、,wait_queue_head_t等,;,Linux 设备驱动程序基本框架,中断服务程序,Devfs接口,设备文件系统,动态生成设备节点信息,Proc接口,提供内核状态信息,包括中断,IO等,Linux 设备驱动程序基本框架,编写 Linux 驱动程序几点注意事项,时序的把握,中断的使用,内存的分配,Linux 设备驱动程序调试技术,printk 内核打印信息,根据记录级别输出信息,全部信息可查看,/proc/kmsg,ioctl 系统调用,strace 查看用户空间程序运行状态,Oops (panic)信息解读 ksymoops,Gdb等调试工具,gdb /usr/src/linux/vmlinux /proc/kcore,Linux 下驱动加载方式,动态内核模块,module_init(s3c2410_uda1341_init);,module_exit(s3c2410_uda1341_exit);,编译进内核,显式调用:,如framebuffer驱动,在fbmem.c中,#ifdef CONFIG_FB_S3C2410, s3c2410, s3c2410fb_init,s3c2410fb_setup ,#endif,隐式调用:,_initcall(gpio_init);,驱动原码分析,所有原代码均以S3C2410为例,GPIO 驱动,LCD 驱动代码,MTD 驱动代码,驱动原码分析,GPIO 驱动,驱动原码分析,驱动原码分析,用户空间,编写应用程序,创建设备节点,mknod c /dev/gpio 220 0,驱动原码分析,LCD 驱动代码,主要配置参数,驱动原码分析,framebuffer操作函数集,驱动原码分析,驱动原码分析,MTD 驱动代码,具体编写方法,创建Drivers/mtd/maps/s3c2410_nor.c,可从最相近板子FLASH map文件拷贝过来.,#cp pxa_cerf.c s3c2410_nor.c,并按自己板子的FLASH分布结构,修改FLASH启始位置及创建分区表.,驱动原码分析,MTD 驱动代码,驱动原码分析,MTD 驱动代码,修改mtd/map/Config.in,添加关于2410的定义,修改mtd/map/Makefile,添加关于2410的编译规则,ARM linux 文件系统,ARM linux 文件系统类型,ARM linux 文件系统生成方法,如何选择适合自己的根文件系统,常用的几个应用程序包,ARM linux 文件系统类型,RAM disks,Cramfs,Jffs2,Yaffs,Romfs,NFS,ARM linux 文件系统生成方法,一般都是通过宿主机端运行image制作程序来生成,#mkcramfs root_dir filename.cramfs,#mkfs.jffs2 root_dir filename.jffs2,#mkyaffsimage yaffs_dir file.yaffs,#genromfs -v -V ROMdisk -f $(ROMFSIMG) -d $(ROMFSDIR),系统引导后拷贝文件,#mount t jffs2 /dev/mtdblock/2 /usr,#cp /tmp/yourfile /usr,ARM linux 文件系统生成方法,Ram disk制作方法,生成一个空的img文件,格式化,挂载,下面就可以向img里面拷贝你所需要的东西了,#cp av rootfs/* /tmp/initrd,ARM linux 文件系统生成方法,Ram disk制作方法,将img压缩生成我们所需的initrd,# umount tmp/initrd,# gzip -9 images/initrd.gz,Ram disk的压缩比例高达60%,ARM linux 文件系统生成方法,NFS,nfs网络文件系统,需要在宿主机端运行nfs server服务,并将整理好的目标板的根文件系统文件夹export给指定IP客户端,内核为了支持NFS作为根文件系统需要选择NFS协议,如下所示:,ARM linux 文件系统生成方法,NFS,命令行设置:,root=/dev/nfs rw nfsroot=12.345.67.89:/yourpath,NFS网络文件系统是嵌入式开发中常用手段,应用程序调试便捷,降低FLASH烧写次数,如果bootloader中支持NFS,那么内核也可以通过tftp+nfs进行调试,这也是linux下NC的常用实现手法.,如何选择适合自己的根文件系统,选择依据,FLASH 空间大小,RAM 空间大小,启动速度,数据保存,如何选择适合自己的根文件系统,几种文件系统的性能对比,常用的几个应用程序包,图形界面开发,图形界面简介,常见嵌入式Linux GUI比较,Minigui移植,QT/Embedded移植,图形界面简介,GUI (graphical user interfaces ),为用户提供界面友好的所见所得的图形操作环境,用户通过 GUI 与系统进行交互。,GUI基本框架,图形界面简介,常见嵌入式Linux GUI比较,MiniGUI,MicroWindows,Qt-Embedded,API,WIN32,X,、,WIN32,子集,QT(C+),函数库典型大小,500k,600k,1.5M,可移植性,好,很好,较好,授权条款,GPL/,商业条款,MPL,QPL/GPL/,商业条款,多语种支持,独特的多字符集支持,一般,采用,UNICODE,可配置型,好,一般,复杂,系统资源消耗,小,较大,大,效率,好,较差,较差,使用广泛性,中国地区,主要是美国,欧美、韩国使用广泛,Minigui移植,MiniGUI 简介,MiniGUI 的层次结构,MiniGUI 的运行模式,平台移植实例,MiniGUI 简介,1998年,魏永明老师创办了 MiniGUI 项目,MiniGUI的目标是提供一个轻量级的跨平台图形用户界面支持系统,适合基于 Linux/uClinux、eCos、 uC/OS-II等操作系统的实时嵌入式系统。,MiniGUI 的层次结构,在最底层,GAL和IAL提供底层图形接口以及鼠标和键盘的驱动;中间层是MiniGUI的核心层,其中包括了窗口系统必不可少的各个模块;最顶层是API,即编程接口。,MiniGUI 的运行模式,MiniGUI-Threads,采用线程机制,提高效率和减少资源,适合于具有单一功能的实时系统,MiniGUI-Lite,采用简化的进程间客户/服务器结构,支持多进程、接口,适合于复杂嵌入式系统,平台移植实例,以2410为例讲述MiniGUI的平台移植,免费下载MiniGUI库文件源代码:,libminigui-1.3.3.tar.gz,minigui-res-1.3.3.tar.gz,mde-1.3.0.tar.gz。,解压缩到工作路径,输入引擎的开发 (应与内核对应),src/ial/2410.c是MiniGUI写的基于2410的触摸屏输入引擎,我们在此基础上进行完全修改。,平台移植实例,交叉编译,创建编译脚本如下:,#!/bin/sh,rm -f config.cache config.status,CC=armv4l-unknown-linux-gcc ,./configure -prefix=/opt/host/armv4l/armv4l-unknown-linux ,-build=i386-linux ,-host=arm-unknown-linux ,-target=arm-unknown-linux ,-disable-debug ,-disable-static ,-enable-lite ,-disable-vbfsupport ,-enable-smdk2410ial ,-disable-jpgsupport ,-disable-big5support,Thanks!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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