![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux驱动开发-Tiny6410
jefbai
喜欢编程,热爱探索!
展开
-
Linux下驱动开发之二(LED驱动)-------Tiny6410
裸机下控制LED灯非常方便,只需要配置好GPIO引脚功能,然后向GPIO引脚映射的内存地址处写入数据即可,但linux下驱动就不那么简单了,需要结合字符设备驱动的架构,然后将功能实现添加进去,笔者参考linux设备驱动程序(第三版)中介绍的新的接口来实现驱动。友善之臂官网提供的源码是基于miscdevice的驱动,而且接口似乎有点老,比如在linux设备驱动程序(第三版)中强调需要使用新的内存I/原创 2013-12-02 21:45:40 · 1656 阅读 · 0 评论 -
Linux驱动开发之三----按键驱动(Tiny6410)
Linux内核版本:2.6.38编译器:arm-linux-gcc-4.5.1有了操作系统后,对于中断的处理比较简单,因为操作系统已经为你搭建好了中断体系结构,并且对它进行了初始化,而普通的程序员要做的事情就是编写用户中断处理程序,并调用内核提供给用户的接口来注册中断,这样就OK了,至于什么使能中断、中断清理啊,这些都由操作系统来完成。在ARM体系结构中,Linux使用irq_de原创 2013-12-04 14:21:18 · 2044 阅读 · 0 评论 -
Linux驱动开发之八-----按键驱动(异步通知机制)
在Linux下,异步通知类似于信号机制,内核和应用程序之间采用通知方法来告知是否发生对应的事件,并进一步采取相应的动作,当产生按键动作时,发生中断,由驱动程序使用kill_fasync函数告知应用程序,而应用程序需要向内核提供PID,然后就可以工作了。驱动fasync接口实现:int buttons_fasync(int fd, struct file *filp, int on){原创 2013-12-11 23:50:54 · 1120 阅读 · 0 评论 -
Linux驱动开发之七----按键驱动poll实现
poll函数是Unix提供的一个系统调用函数,可以同时查询多个文件描述符的状态,类似功能的函数还有select,它们都使用了称之为I/O multiplexing技术,先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已经准备好进行I/O时,该函数才返回;返回时告诉进程哪些描述符已经准备好可以进行I/O。poll调用的流程如下图所示:最终的poll会调用由驱动实现的对原创 2013-12-11 23:39:18 · 963 阅读 · 0 评论 -
Linux驱动开发之六----按键驱动(中断方式)修改版
在上一篇博文中记录了第一次写的按键驱动,当时是完全参考友善之臂的设计,基本没怎么思考,也不太明白Linux下中断处理的流程,今天仔细分析了下Linux下外部中断的处理流程,所以修改了下以前的代码。当按下中断后,发生中断,发生以下事情1.CPU进入异常模式,并跳转到vector_irq + stubs_offset处2.因为在用户模式发生中断,所以跳转到__irq_usr指示的地址处原创 2013-12-11 15:51:28 · 1023 阅读 · 0 评论 -
Linux外部中断架构初始化流程-----Tiny6410
arch/arm/plat-s3c64xx/irq-eint.c文件实现了S3C64XX系列的外部中断初始化,这是一个内核模块,入口点是s3c64xx_init_irq_eint,声明如下:arch_initcall(s3c64xx_init_irq_eint);参考源码可以确定编译时会将其替换为static initcall_t __initcall_原创 2013-12-10 19:26:23 · 1678 阅读 · 0 评论 -
module_init宏分析
一直在使用module_init和module_exit宏,但是对于这两个宏依然比较陌生,不知道它到底为程序员做了什么东西,今天闲来无事,就打开source insight分析了下它的具体实现,瞬间明白了,现在将笔记整理下。以经典的hello_world模块为例,在模块实现文件中,我们编写了如下语句:module_init(hello_init);那么它会被编译器展开成什么样子呢?在文原创 2013-12-10 14:03:51 · 1294 阅读 · 0 评论 -
Linux驱动开发之五---按键驱动(查询方式)(Tiny6410)
在Linux驱动程序开发之三----按键驱动(Tiny6410)博文中讨论了使用中断来实现按键驱动,毫无疑问,中断方式效率相当高,但是在此之前,CPU要想获知按键的状态都是通过查询方式来实现的,查询方式就是CPU不停的检查按键的状态,如果有变化则立即输出,而中断是外设向CPU传递消息,告诉CPU自己状态改变了,要求CPU进行处理,而其他时间CPU可以做自己想做的事情,和微机原理以及操作系统课程中讲原创 2013-12-10 16:35:39 · 2138 阅读 · 1 评论 -
Linux驱动开发之四-----LED改进测试(增加自动创建设备节点)
在 Linux下驱动开发之二(LED驱动)-------Tiny6410这篇博文中,讨论了编写LED驱动的两种实现方法,一种是使用miscdevice驱动,一种是使用标准的字符设备驱动开发方法,但是在读写I/O口的时候都是直接使用系统提供的S3C64XX_GPKDAT等相应地址,一直以为它就对应的是S3C6410数据手册上的物理地址,但今天使用后才发现原来已经被转化成虚拟地址了,在linu原创 2013-12-10 14:38:58 · 1170 阅读 · 1 评论 -
Linux下驱动开发之一-------Tiny 6410
内核:linux-2.6.38编译器:arm-linux-gcc4.5.1 主机:VMware 7.0 + Fedora9-i386 首先,由于笔者的NAND FLASH是MLC2的,通过u-boot不能启动,所以只好用友善提供的superboot工具,但能启动起来就OK了,现在还是菜鸟,等学习Linux够格了,再来解决这个问题。原创 2013-12-02 20:51:33 · 1361 阅读 · 0 评论 -
Linux驱动开发----块设备驱动(内存模拟)Tiny6410
写了好久的字符设备驱动,是时候看下块设备驱动程序设计方法了,块设备驱动和字符设备不同,字符设备是直接和虚拟文件系统进行交互,而块设备驱动则是通过块缓冲/调度层间接和虚拟文件系统交互;块设备驱动数据访问都是以块为单位;多个块I/O需要组成一个请求队列,这个功能是块缓冲/调度层提供的,它出于硬件特性和读写性能的考虑,将块I/O进行重新排序,并组成一个请求队列,交给内核,内核则调用请求队列处理函数来逐个原创 2013-12-18 00:11:52 · 1388 阅读 · 0 评论