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

上传人:laozhun 文档编号:2392856 上传时间:2023-02-17 格式:DOC 页数:4 大小:21KB
返回 下载 相关 举报
嵌入式GPIO课程设计报告.doc_第1页
第1页 / 共4页
嵌入式GPIO课程设计报告.doc_第2页
第2页 / 共4页
嵌入式GPIO课程设计报告.doc_第3页
第3页 / 共4页
嵌入式GPIO课程设计报告.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《嵌入式GPIO课程设计报告.doc》由会员分享,可在线阅读,更多相关《嵌入式GPIO课程设计报告.doc(4页珍藏版)》请在三一办公上搜索。

1、嵌入式课程设计报告一, 设计要求(1) GPIO15,实现对GPIO的操作,重点介绍驱动程序框架的设计,以及在嵌入式系统中调试驱动程序的流程。(2) 基于轮询的UART驱动设计,用户空间和内核空间的数据互传。二, 设计实现(1) GPIO的驱动设计主要包括以下四个函数的设计:加载本驱动是执行init_module函数,以注册本驱动,同时系统为本驱动分配一对唯一的主设备号和从设备号;卸载驱动时执行cleanup_module函数,系统回收已分配的主设备号和从设备号;打开驱动程序文件时执行gpio_open函数,通过调用GPIO_init初始化GPIO15,设置其为输出端口,通过调用GPIO_hi

2、g使GPIO15引脚输出高电平,并将驱动程序的引用计数加1;关闭驱动程序文件时执行gpio_release函数,并调用GPIO_low使GPIO15引脚输出低电平,并将驱动程序的引用计数减1. 在驱动程序设计中,由于linux运行事使用的是虚拟内存,因此在驱动程序中访问处理器的特殊功能寄存器时,需要将相应的特殊功能寄存器的物理地址转化成虚拟地址。本例中,就是包含头文件,通过hardware.h中进一步引用定义了PXA270处理器特殊功能寄存器虚拟地址的头文件includeasm-asmarch-pxapxa-regs.h。其中定义了控制GPIO所需的三个寄存器:#define GPDRO _R

3、EG(0x40E0000C)/*GPIO方向寄存器*/#define GPSRO _REG(0X40E00018)/*GPIO输出置为寄存器*/#define GPCRO _REG(0x40E00024)/*GPIO输出复位寄存器*/ 其中_REG宏调用了物理地址到虚拟地址的转换函数io_p2v(x)。 #define io_p2v(x)(x丨0xbe000000)(x)1)&0x06000000) #define_REG(x)_REGP(io_p2v(x) GPIO驱动程序部分源代码如下: #ifndef MODULE #define MODULE #endif #ifndef_KERNEL

4、_ #define_KERNEL_ #endif #if CONFIG_MODVERSIONS=1 #define MODVERSIONS #include #endif #include #include #include #include #include #include #include #include #include /#include #include #include #ifndef KERNEL_WERSIONS (2) 所谓轮询方式,是指内核定期对设备的状态进行查询,然后作出相应的处理。基于轮询的UART驱动程序,其主要函数的功能如下:Init_module()函数用来初

5、始化串口模块,加载串口设备驱动。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()函数将接收

6、数据复制到用户空间。Cleanup_module()函数将BTuart设备驱动卸载。Uart_init(void)函数主要来配置串口的波特率、数据位、停止位和奇偶校验位。SerialOutputByte(const char c)函数是串口发送函数,将字符C通过串口发送出去。SerialoutputByte(void)函数是串口接收数据函数。基于轮询的UART驱动程序的部分源代码如下:#include#include#if CONFIG_MODVERSIONS=1#define MODVERSIONS#include待添加的隐藏文字内容3#endif#include#include#inclu

7、de#include#include#include#include#ifndef KERNEL_VERSIONS#define KERNEL_VERSIONS(a,b,c)(a)*65536+(b)*256+(c)#endif#if linux_VERSION_CODEKERNEL_VERSION(2,2,0)#include#endif#define DEVICE_NAME”uart_test”#define setuartband三, 设计总结设备驱动程序,他直接与相应设备打交道,并且向上层提供一组访问接口,内核常常使用设备类型、主设备号和次设备号来标识一个具体的设备,在设备管理中用户可

8、以像访问普通文件一样访问外部设备。在linux中所有的硬件设备均被当作特殊的设备文件处理,可以使用标准的文件操作,对于字符设备和块设备,其设备文件用mknod命令创建,用主设备号和次设备号来标识,同一个设备驱动程序控制的所有设备具有相同的主设备号,并用不同的次设备号加以区别,然后,对设备进行操作的系统调用和对文件操作类似,最后通过内核将系统调用转换成对物理设备的操作。驱动的实现就是编写一组被系统调用的函数,然后加载到系统中,这些函数能够实现对硬件的操作,能够通过和系统的接口与上层应用程序交互信息。设备驱动在加载时首先需要调用入口函数init_module(),该函数完成驱动的初始化工作,比如寄

9、存器置位、结构体赋值等一系列的工作,其中一个最重要的工作就是向内核注册该设备,字符设备调用函数register_chrdve()完成注册,注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关联,设备驱动在卸载时需要回收相应的资源,将设备的响应寄存器值复位并从系统中注销该设备的操作过程,设备驱动程序可以分为三个主要的部分:一自动配置和初始化子程序。负责检测所需驱动的硬件设备是否存在以及是否能够正常工作,这部分驱动只在初始化时被调用一次。二服务I/O就是请求子程序,这部分是系统调用的结果。三中断服务程序又称驱动程序的下半部分,设备在I/O请求结束或其他状态改变时产生中断,因为设备驱动程序支持同一类型的若干设备,所以调用中断服务子程序时都带有一个或多个参数以唯一标识请求服务的设备。内核模块是linux内核的重要组成部分,内核模块能在linux系统启动之后动态进行装载和卸载,因此不需对内核进行重新编译或重启系统就可以将内核的一部分替换掉,linux内核的所有设备驱动、文件系统、网络协议等可做成模块的形式来提供。在所有模块中需记录编译的内核版本信息,并与当前执行的内核版本一致,即模块具有版本依赖性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号