会员注册 | 登录 | 微信快捷登录 支付宝快捷登录 QQ登录 微博登录 | 帮助中心 人人文库renrendoc.com美如初恋!
站内搜索 百度文库

热门搜索: 直缝焊接机 矿井提升机 循环球式转向器图纸 机器人手爪发展史 管道机器人dwg 动平衡试验台设计

   首页 人人文库网 > 资源分类 > DOC文档下载

嵌入式GPIO课程设计报告.doc

  • 资源星级:
  • 资源大小:25.00KB   全文页数:4页
  • 资源格式: DOC        下载权限:注册会员/VIP会员
您还没有登陆,请先登录。登陆后即可下载此文档。
  合作网站登录: 微信快捷登录 支付宝快捷登录   QQ登录   微博登录
友情提示
2:本站资源不支持迅雷下载,请使用浏览器直接下载(不支持QQ浏览器)
3:本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

嵌入式GPIO课程设计报告.doc

嵌入式课程设计报告一,设计要求(1)GPIO15,实现对GPIO的操作,重点介绍驱动程序框架的设计,以及在嵌入式系统中调试驱动程序的流程。(2)基于轮询的UART驱动设计,用户空间和内核空间的数据互传。二,设计实现(1)GPIO的驱动设计主要包括以下四个函数的设计加载本驱动是执行init_module函数,以注册本驱动,同时系统为本驱动分配一对唯一的主设备号和从设备号卸载驱动时执行cleanup_module函数,系统回收已分配的主设备号和从设备号打开驱动程序文件时执行gpio_open函数,通过调用GPIO_init初始化GPIO15,设置其为输出端口,通过调用GPIO_hig使GPIO15引脚输出高电平,并将驱动程序的引用计数加1关闭驱动程序文件时执行gpio_release函数,并调用GPIO_low使GPIO15引脚输出低电平,并将驱动程序的引用计数减1.在驱动程序设计中,由于linux运行事使用的是虚拟内存,因此在驱动程序中访问处理器的特殊功能寄存器时,需要将相应的特殊功能寄存器的物理地址转化成虚拟地址。本例中,就是包含头文件,通过hardware.h中进一步引用定义了PXA270处理器特殊功能寄存器虚拟地址的头文件\include\asmasm\archpxa\pxaregs.h。其中定义了控制GPIO所需的三个寄存器defineGPDRO_REG0x40E0000C/GPIO方向寄存器/defineGPSRO_REG0X40E00018/GPIO输出置为寄存器/defineGPCRO_REG0x40E00024/GPIO输出复位寄存器/其中_REG宏调用了物理地址到虚拟地址的转换函数io_p2vx。defineio_p2vxx丨0xbe000000x10x06000000define_REGx_REGPio_p2vxGPIO驱动程序部分源代码如下ifndefMODULEdefineMODULEendififndef_KERNEL_define_KERNEL_endififCONFIG_MODVERSIONS1defineMODVERSIONSincludeendifincludeincludeincludeincludeincludeincludeincludeincludeinclude//includeincludeincludeifndefKERNEL_WERSIONS2所谓轮询方式,是指内核定期对设备的状态进行查询,然后作出相应的处理。基于轮询的UART驱动程序,其主要函数的功能如下Init_module函数用来初始化串口模块,加载串口设备驱动。Uart_open函数用来打开一个串口设备节点,当一个设备节点被打开时,计数器MOD_INC_USE_COUNT加1.Uart_release函数用来关闭一个设备节点,当一个设备节点被关闭时,MOD_DEC_USE_COUNT减1.uart_write函数首先调用copy_from_user函数将用户空间的数据复制到内核空间,然后通过蓝牙串口BTuart发送出去,在该函数中调用了SerialOutputByte函数。uart_read函数中,首先读BTRBR寄存器,将接收到的数据读到内核空间,然后通过copy_to_user函数将接收数据复制到用户空间。Cleanup_module函数将BTuart设备驱动卸载。Uart_initvoid函数主要来配置串口的波特率、数据位、停止位和奇偶校验位。SerialOutputByte(constcharc)函数是串口发送函数,将字符C通过串口发送出去。SerialoutputByte(void)函数是串口接收数据函数。基于轮询的UART驱动程序的部分源代码如下includeincludeifCONFIG_MODVERSIONS1defineMODVERSIONSincludeendifincludeincludeincludeincludeincludeincludeincludeifndefKERNEL_VERSIONSdefineKERNEL_VERSIONSa,b,ca65536b256cendififlinux_VERSION_CODEKERNEL_VERSION2,2,0includeendifdefineDEVICE_NAMEuart_testdefinesetuartband三,设计总结设备驱动程序,他直接与相应设备打交道,并且向上层提供一组访问接口,内核常常使用设备类型、主设备号和次设备号来标识一个具体的设备,在设备管理中用户可以像访问普通文件一样访问外部设备。在linux中所有的硬件设备均被当作特殊的设备文件处理,可以使用标准的文件操作,对于字符设备和块设备,其设备文件用mknod命令创建,用主设备号和次设备号来标识,同一个设备驱动程序控制的所有设备具有相同的主设备号,并用不同的次设备号加以区别,然后,对设备进行操作的系统调用和对文件操作类似,最后通过内核将系统调用转换成对物理设备的操作。驱动的实现就是编写一组被系统调用的函数,然后加载到系统中,这些函数能够实现对硬件的操作,能够通过和系统的接口与上层应用程序交互信息。设备驱动在加载时首先需要调用入口函数init_module,该函数完成驱动的初始化工作,比如寄存器置位、结构体赋值等一系列的工作,其中一个最重要的工作就是向内核注册该设备,字符设备调用函数register_chrdve完成注册,注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关联,设备驱动在卸载时需要回收相应的资源,将设备的响应寄存器值复位并从系统中注销该设备的操作过程,设备驱动程序可以分为三个主要的部分一自动配置和初始化子程序。负责检测所需驱动的硬件设备是否存在以及是否能够正常工作,这部分驱动只在初始化时被调用一次。二服务I/O就是请求子程序,这部分是系统调用的结果。三中断服务程序又称驱动程序的下半部分,设备在I/O请求结束或其他状态改变时产生中断,因为设备驱动程序支持同一类型的若干设备,所以调用中断服务子程序时都带有一个或多个参数以唯一标识请求服务的设备。内核模块是linux内核的重要组成部分,内核模块能在linux系统启动之后动态进行装载和卸载,因此不需对内核进行重新编译或重启系统就可以将内核的一部分替换掉,linux内核的所有设备驱动、文件系统、网络协议等可做成模块的形式来提供。在所有模块中需记录编译的内核版本信息,并与当前执行的内核版本一致,即模块具有版本依赖性。

注意事项

本文(嵌入式GPIO课程设计报告.doc)为本站会员(21ask)主动上传,人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知人人文库网([email protected]),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。

copyright@ 2015-2017 人人文库网网站版权所有
苏ICP备12009002号-5