zhangxiangliang2的专栏

poll机制(查询机制),隔一段时间查询—下有没有中断。

第四个驱动程序增加poll机制。应用程序里面open() 函数,read() 函数,write ()函数,poll() 函数分别对应drv_open(),drv_read(),drv_write(),drv_poll()函数。读取按键的多种方式,1.查询方式,耗资源。2.中断方式,如果没有按键按下,read()函数一直等待,永远不会返回。3.poll机制,指定—段时间后返回。这三种方法有—个共同的特点,,都是应用程序主动去查询。有没有另外一种方法,驱动程序主动提醒应用程序,然后应用程序来读键值。这种方法叫做异步通知。通过信号single来实现。具体操作,1.应用程序里注册信号处理函数。2.谁发,驱动程序岌。3.发给谁,发给应用程序(应用程序要把自己的PID告诉驱动程序)。4. 怎么发,驱动程序调用kill_fasync()函数。……………………………………同—时刻,只能有一个应用程序打开设备/dev/buttons………………………阻塞操作,当读—个按键值,如果没有按键按下,就—直等待。非阻塞操作,当读一个按键值,如果没有按键按下,就返回。SRAM,SDRAM,网卡有地址总线,由cpu统一编址。 NAND flash没有地址总线。 因 此有这两者寻址方式不同。字符设备驱动程序的框架。驱动程序 1.有led.read,led.write,led.open 这些函数,2.定义了—个结构体fileoperation,这个结构体包含指向led.read的.read 函数,包含指向led.write的.write函数,包含指向led.open 的.open函数。3.入口函数(把fileoperation结构体告诉内核的函数),通过register_chedev(main,name,fileoperation)。编译驱动程序要依赖内核。ioremap把物理地址映射为虚拟地址。本来主设备号可以手动分配,但驱动程序也可以自动分配主设备号。应用程序打开一个设备open("/dev/xxx"),这个设备哪里来的。1.手工建立,mknod /dev/xxx c 主 次 此时需要知道主设备号2.自动创建,mdev(mdev是udev的—个简化版本)根据系统信息创建设备节点。所以驱动程序要提前提供上面所需的系统信息,这样才能自动创建。写一个驱动程序。(用查询方式点亮led灯)1.写出框架,a.写出fileoperation结构体,里面有.open,.read,.write 等成员。b.该结构体通过入口函数注册到内核。同时需要出口函数,修饰入口函数,修饰出口函数。c.给内核提供系统信息,这样udev机制可以自动创建设备节点。祥细步骤,在入口函数创建class,并创建clasd device 。同时要在出口函数将这些东西卸载掉。d.最后加上一个lisence。2.硬件操作,a.看原理图,确定是哪些引脚接到按键上。b.看2440手册,确定怎么操作这些引脚,以及操作什么寄存器。c.编程。上面三步在单片机里面基本相同,不同之处是单片机直接操作物理地址,而此时驱动程序采用虚拟地址。VA=ioremap(PA,size)。……………………………………………写一个驱动程序(用中断方式点亮led灯)1.在open函数将引脚配置为中断引脚,即request_irq()。2.右fileoperation结构体里增加成员.release()函数 ( 用来释放中断引脚)。即. .release()=second_drv_close();3.实现函数second_drv_close()4.实现request_irq()函数中的—个参数buttons_irq()。5.增加头文件irq.h等。在open函数配置引脚,在read函数读引脚状态(通过copy_to_user()函数将引脚状态传给用户)。在入口函数进行地址映射。在出口函数解除映关系。top命令相当于任务管理器。共享中断,中断来源有很多种,共享同一个引脚。中断是异常的—种。单片机下的中断处理过程:1.分辨中断源,2.调用相应的处理程序,3.清中断。在linux内核中,这三项由asm_do_IRQ()函数实现。

现在睡觉的话,会做梦;而现在学习的话,会让梦实现。

zhangxiangliang2的专栏

相关文章:

你感兴趣的文章:

标签云: