嵌入式GPIO课程设计报告.doc_第1页
嵌入式GPIO课程设计报告.doc_第2页
嵌入式GPIO课程设计报告.doc_第3页
嵌入式GPIO课程设计报告.doc_第4页
全文预览已结束

下载本文档

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

文档简介

嵌入式课程设计报告一,设计要求(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处理器特殊功能寄存器虚拟地址的头文件includeasm-asmarch-pxapxa-regs.h。其中定义了控制GPIO所需的三个寄存器:#defineGPDRO_REG(0x40E0000C)/*GPIO方向寄存器*/#defineGPSRO_REG(0X40E00018)/*GPIO输出置为寄存器*/#defineGPCRO_REG(0x40E00024)/*GPIO输出复位寄存器*/其中_REG宏调用了物理地址到虚拟地址的转换函数io_p2v(x)。#defineio_p2v(x)(x丨0xbe000000)(x)1)&0x06000000)#define_REG(x)_REGP(io_p2v(x)GPIO驱动程序部分源代码如下:#ifndefMODULE#defineMODULE#endif#ifndef_KERNEL_#define_KERNEL_#endif#ifCONFIG_MODVERSIONS=1#defineMODVERSIONS#include#endif#include#include#include#include#include#include#include#include#include/#include#include#include#ifndefKERNEL_WERSIONS(2)所谓轮询方式,是指内核定期对设备的状态进行查询,然后作出相应的处理。基于轮询的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_init(void)函数主要来配置串口的波特率、数据位、停止位和奇偶校验位。SerialOutputByte(constcharc)函数是串口发送函数,将字符C通过串口发送出去。SerialoutputByte(void)函数是串口接收数据函数。基于轮询的UART驱动程序的部分源代码如下:#include#include#ifCONFIG_MODVERSIONS=1#defineMODVERSIONS#include#endif#include#include#include#include#include#include#include#ifndefKERNEL_VERSIONS#defineKERNEL_VERSIONS(a,b,c)(a)*65536+(b)*256+(c)#endif#iflinux_VERSION_CODEKERNEL_VERSION(2,2,0)#include#endif#defineDEVICE_NAME”uart_test”#definesetuartband三,设计总结设备驱动程序,他直接与相应设备打交道,并且向上层提供一组访问接口,内核常常使用设备类型、主设备号和次设备号来标识一个具体的设备,在设备管理中用户可以像访问普通文件一样访问外部设备。在linux中所有的硬件设备均被当作特殊的设备文件处理,可以使用标准的文件操作,对于字符设备和块设备,其设备文件用mknod命令创建,用主设备号和次设备号来标识,同一个设备驱动程序控制的所有设备具有相同的主设备号,并用不同的次设备号加以区别,然后,对设备进行操作的系统调用和对文件操作类似,最后通过内核将系统调用转换成对物理设备的操作。驱动的实现就是编写一组被系统调用的函数,然后加载到系统中,这些函数能够实现对硬件的操作,能够通过和系统的接口与上层应用程序交互信息。设备驱动在加载时首先需要调用入口函数init_module(),该函数完成驱动的初始化工作,比如寄存器置位、结构体赋值等一系列的工作,其中一个最重要的工作就是向内核注册该设备,字符设备调用函数register_chrdve()完成注册,注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关联,设备驱动在卸载时需要回收相应的资源,将设备的响应寄存器值复位并从系统中注销该设备的操作过程,设备驱动程序可以分为三个主要的部分:一自动配置和初始化子程序。负责检测所需驱动的硬件设备是否存在以及是否能够正常工作,这部分驱动只在初始化时被调用一次。二服务I/O就是请求子程序,这部分是系统调用的结果。三中断服务程序又称驱动程序的下半部分,设备在I/O请求结束或其他状态改变时产生中断,因为设备驱动程序支持同一类型的若干设备,所以调用中断服务子程序时都带有一个或多个参数以唯一标识请求服务的设备。内核模块是linux内核的重要组成部

温馨提示

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

评论

0/150

提交评论