国嵌驱动专题一二

原创 2015年07月08日 22:32:16

一、使用字符设备驱动

1、编译驱动、安装;创建设备文件;访问设备

2、设备描述结构cdev:结构定义;设备号dev_t;设备操作集

3、驱动初始化:分配设备描述结构;初始化设备描述结构;注册设备描述结构

4、设备号为unsigned int;MKDEV;MAJOR;MINOR

5、动态分配主设备号:alloc_chrdev_region;驱动退出时:unregister_chrdev_region

6、描述结构的分配:静态struct cdev mdev;动态cdev_alloc()

7、描述结构的初始化:cdev_init

8、描述结构的注册:cdev_add()

9、驱动注销:cdev_del

二、混杂设备驱动模型

1、拥有相同的主设备号10称为混杂设备

2、设备描述:struct miscdevice

3、注册混杂设备驱动:misc_register()

4、内核中断处理流程:irq_svc入口-->获取中断号-->根据中断号找到相应的irq_desc结构-->取出事先注册好的处理函数运行

5、中断注册:request_irq(unsigned int irq, void (*handler)( ), unsigned long flags, const char *devn ame, void *dev_id)

6、flags:IRQF_DISABLED(SA_INTERRUPT)表示快速中断;IRQF_SHARED(SA_SHIRQ)表明该中断号是多个设备共享的

7、中断注销:free_irq()

8、中断嵌套:当中断发生时,又产生了其他中断

9、中断嵌套的处理方法-->中断分层技术:软中断;tasklet;工作队列

10、工作队列:将下半部分交给内核线程处理

11、描述工作队列:struct workqueue_struct

12、描述一个工作项:struct work_struct

13、创建工作队列:create_workqueue

14、创建工作:INIT_WORK

15、提交工作:queue_work

16、提交工作到默认队列:schedule_work

17、内核定时器:struct timer_list

18、初始化定时器:init_timer()、 设置超时函数、

19、注册定时器:add_timer()

20、启动定时器:mod_timer(要启动的定时器,超时时间)

21、当一个进程试图向设备读写数据时,设备暂时没有准备好数据。。驱动程序就应当阻塞进程,进入睡眠状态,直到请求得到满足

22、定义等待队列:wart_queue_head_t        my_queue

23、初始化等待队列:init_waitqueue_head(&my_queue)

24、定义+初始化等待队列:DECLARE_WAIT_QUEUE_HEAD(my_queue)

25、进入等待队列,睡眠:wait_event(queue,  condition),当condition为真时,立即返回,否则进入TASK_UNINTERRUPTIBLE

26、wait_event_interruptible(queue,  condition),当condition为真时,立即返回,否则进入TASK_INTERRUPTIBLE

27、从等待队列中唤醒进程:wake_up()   --->可唤醒UNINT*、INT*、KILL*的所有进程

28、wake_up_interruptible(),只能唤醒TASK_INTERRUPTIBLE的进程


三、总线设备驱动

1、总线描述:bus_type

2、总线描述结构中的match函数:当一个新设备或新驱动被添加到这个总线时,调用该函数。判断是否匹配

3、总线的注册:bus_register()

4、总线的注销:bus_unregister()

5、驱动描述结构:device_driver

6、驱动的注册:driver_register()

7、驱动的注销:driver_unregister()

8、设备描述结构:struct device

9、设备的注册:device_register()\

10、设备的注销:device_unregister()

11、平台总线:Platform bus 

12、平台设备描述结构:struct platform_device

13、注册平台设备:platform_device_register()

14、平台驱动描述结构:struct platform_driver

15、注册平台驱动:platform_driver_register()

注:16、当device_register注册设备时,dev->name会赋值给dev->kobj.name,自己变为NULL

注:17、先加载总线,后加载驱动或设备

相关文章推荐

专题3-5.#pragma预处理分析(国嵌C语言视频)

1. #pragma简介 #pragma是编译器指示字,用于指示编译器完成一些特定的动作  #pragma所定义的很多指示字是编译器和操作系统特有的  #pragma在不同的编译器间是不可移...

国嵌ARM 上学期专题2之我从内部看ARM 常见问题解决方案和知识点总结

一.家族检阅 1.名词分类: (1)芯片名称:2440,210,6410, (2)ARM核:a8,arm9,arm11 (3)指令架构:armv4,armv6,armv7 2.每一个...

下篇--ARM时钟初始化--配置时钟(基于ok6410)--国嵌第三季-专题7

6410(3个PLL-APLL、MPLL、EPLL) 1、设置locktime 2、设置分频系数 3、设置CPU到异步工作模式 4、设置FCLK...

专题6-3.函数调用行为, 递归函数(国嵌C语言视频)

1. 活动记录 活动记录是函数调用时用于记录一系列相关信息的记录  临时变量域:用来存放临时变量的值,如k++的中间结果  局部变量域:用来存放函数本次执行中的局部变量  机器状态域:...

专题4-3.数组与指针分析(国嵌C语言视频)

1. 数组本质 数组是一段连续的内存空间 数组的空间大小为sizeof(array_type) * array_size 数组名可看做指向数组第一个元素的常量指针   2. 指针的运...

上篇--ARM时钟初始化--了解时钟体系--国嵌第三季-专题7

一、基本概念 1.1时钟脉冲信号:按一定的电压幅度 、一定时间间隔连续发出的脉冲信号  1.2时钟脉冲频率:单位时间内产生的 时钟脉冲信号个数。  1.3 信号的产生  [1]晶振 (成本较 ...

栈的初始化及栈帧概念解析--国嵌第三季--专题10 课程1

1、栈:FILO先进后出的数据结构 栈底是第一个进栈的数据的位置(压箱 底)  栈顶是最后一个进栈的数据位置 2、根据SP指针指向的位置,栈可分为 满栈和空栈  满栈:当sp指针总是指...

专题6-2,可变参数列表与宏分析(国嵌C语言视频)

1. 问 如何编写一个可以计算n个数平均值的函数? 答; #include float func(int array[], int size) { int i = 0; flo...

国嵌Linux视频驱动开发

1 Linux PCI、串口驱动程序 1.1 PCI总线概述 总线概念 总线是一种传输信号的信道;总线是连接一个或多个导体的电气连线。总线由电气接口和编程接口组成,我们重点关注编程接口。 PC...

[国嵌学习日志][113][字符设备驱动模型]

设备驱动模型 1.驱动初始化(驱动安装) 1.1.分配设备描述符 1.2.初始化设备描述符 1.3.注册设备描述符 1.4.硬件初始化 2.实现设备操作(驱动操作) 3.驱动注销(驱动卸...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:国嵌驱动专题一二
举报原因:
原因补充:

(最多只允许输入30个字)