
Linux驱动
文章平均质量分 89
Linux驱动开发
Tree-gg
半仙卖苹果
展开
-
17_LinuxLCD驱动
设置好以后保存退出,重新编译Linux内核,编译完成以后使用新编译出来的imx6ull-alientek-emmc.dtb和zImage镜像启动系统,如果LCD驱动工作正常的话就会在LCD屏幕左上角出现一个彩色的小企鹅logo,屏幕背景色为黑色,如图所示。第4行,设置背8级背光(0-7),分别为0、4、8、16、32、64、128、255,对应占空比为0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%,如果嫌少的话可以自行添加一些其他的背光等级值。原创 2023-07-24 23:13:55 · 544 阅读 · 0 评论 -
16_LinuxINPUT子系统
比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。所有的输入设备以文件的形式供用户应用程序使用。卸载input 驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用input_free_device函数释放掉前面申请的input_dev。原创 2023-07-22 15:41:22 · 377 阅读 · 0 评论 -
15_LinuxMISC杂项驱动
随着Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC设备驱动就用于解决此问题。第109-145行, platform框架的probe函数,当驱动与设备匹配以后此函数就会执行,首先在此函数中初始化BEEP所使用的IO。所有的mis设备都属于同一个类, /sys/class/misc目录下就是misc这个类的所有设备,每个设备对应一个子目录。在使用的时候可以从这些预定义的子设备号中挑选一个,当然也可以自己定义,只要这个子设备号没有被其他设备使用接口。原创 2023-07-20 21:16:08 · 280 阅读 · 0 评论 -
14_Linux设备树下的platform驱动编写
第120-164行, platform驱动的probe函数,当设备树中的设备节点与驱动之间匹配成功以后此函数就会执行,原来在驱动加载函数里面做的工作现在全部放到probe函数里面完成。第11行,设置platform_driver中的of_match_table匹配表为上面创建的leds_of_match,至此我们就设置好了platform驱动的匹配表了。第203-206行,驱动模块加载函数,在此函数里面通过platform_driver_register向Linux内核注册led_driver驱动。原创 2023-07-16 14:28:53 · 448 阅读 · 0 评论 -
13_Linux无设备树Platform设备驱动
在实际的驱动开发中,一般12C主机控制器驱动已经由半导体厂家编写好了,而设备驱动一般也由设备器件的厂家编写好了,我们只需要提供设备信息即可,比如12C设备的话提供设备连接到了哪个12C接口上, I2C的速度是多少等等。第10行, match函数,此函数很重要,单词match的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用match函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数。简单介绍一下驱动的分层。原创 2023-07-15 19:22:17 · 579 阅读 · 0 评论 -
12_Linux异步通知
驱动中的信号处理异步通知简介在使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据,类似于我们在裸机例程中讲解的中断。Linux提供了异步通知这个机制来完成此功能。原创 2023-07-09 18:44:37 · 700 阅读 · 0 评论 -
11_Linux阻塞与非阻塞
参数q就是要唤醒的等待队列头,这两个函数会将这个等待队列头中的所有进程都唤醒。第52-73行,这段代码使用 poll函数来实现非阻塞访问,在while循环中使用poll函数不断的轮询,检查驱动程序是否有数据可以读取,如果可以读取的话就调用read函数读取按键数据。noblockioApp的CPU占用率也低至0.0%,和图中的blockioApp一样,这里的0.0%并不是说noblockioApp这个应用程序不使用CPU了,只是因为使用率太小了,而图中只能显示出小数点后一位,因此就显示成了0.0%。原创 2023-07-09 15:06:19 · 524 阅读 · 0 评论 -
10_Linux中断
假如A任务调用local_irq_disable关闭全局中断10S,当关闭了2S的时候B任务开始运行, B任务也调用local_irq_disable关闭全局中断3S, 3秒以后B任务调用 local_irq_enable 函数将全局中断打开了。按键释放了的话就将imx6uirq结构体的keyvalue成员变量的最高位置1,表示按键值有效,也就是将keyvalue与0x80进行或运算,表示按键松开了,并且设置imx6uirq结构体的releasekey成员变量为1,表示按键释放,一次有效的按键过程发生。原创 2023-07-08 23:13:41 · 594 阅读 · 0 评论 -
09_Linux内核定时器
运行测试Linux时间管理和内核定时器简介学习过UCOS或FreeRTOS的同学应该知道, UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟源。同理Linux要运行也是需要一个系统时钟的至于这个系统时钟是由哪个定时器提供的在CortexA7内核中有个通用定时器。原创 2023-07-08 21:30:00 · 769 阅读 · 0 评论 -
08_Linux按键输入
第56-74行,函数keyio_init用于初始化按键,从设备树中获取按键的gpio信息,然后设置为输入。第36-46行,结构体key_dev为按键的设备结构体,第45行的原子变量keyvalue用于记录按键值。第104-120行, keyread函数,应用程序通过read函数读取按键值的时候此函数就会执行。第83-94行, key_open函数通过调用keyio_init函数来始化按键所使用的。按键释放以后标记按键值为KEYOVALUE。O,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。原创 2023-07-02 19:03:53 · 625 阅读 · 0 评论 -
07_Linux并发与竞争
此时你到了电话亭门口,因为里面有人,所以你不能进去打电话,相当于没有获取自旋锁,这个时候你肯定是站在原地等待,你可能因为无聊的等待而转圈圈消遣时光,反正就是哪里也不能去,要一直等到里面的人打完电话出来。终于,里面的人打完电话出来了。所谓的临界区就是共享数据段,对于临界区必须保证一次只有一个线程访问,也就是要保证临界区是原子访问的,都知道,原子是化学反应不可再分的基本微粒,这里的原子访问就表示这一个访问是一个步骤,不能再进行拆分。可以看出,小王打印出来的文档中电话号码错误了,变成小李的了,这是绝对不允许的。原创 2023-07-01 20:59:37 · 265 阅读 · 0 评论 -
06_pinctr子系统与gpio子系统
gpio子系统顾名思义,就是用于初始化GPIO并且提供相应的API函数,比如设置GPIO为输入输出,读取GPIO的值等。当设备和驱动匹配成功以后platform_driver的probe成员变量所代表的函数就会执行,在353行设置probe成员变量为imx6ul_pinctrl_probe函数,因此在本章实验中imx6ul_pinctrl_probe这个函数就会执行,可以认为 imx6ul_pinctrl_probe函数就是I.MX6ULL这个SOC的PIN配置入口函数。gpio子系统提供的常用的AP。原创 2023-06-30 23:19:30 · 531 阅读 · 0 评论 -
05_Linux设备树下的LED驱动
驱动文件中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。第169-174行,通过of_find_property函数获取alphaled节点的compatible属性,返回值为property结构体类型指针变量, property的成员变量value表示属性值。通过of_property_read_u32_array函数获取alphaled节点的reg属性所有值,并且将获取到的值都存放到 regdata 数组中。原创 2023-06-25 20:18:42 · 603 阅读 · 0 评论 -
04_Linux设备树DTB文件OF函数
图中框起来的部分就是函数do_bootm_linux函数的执行流程,也就是说do_bootm_linux函数会通过一系列复杂的调用,最终通过fdt_chosen函数在chosen节点中加入了bootargs属性。在图中,根节点属性属性表现为一个个的文件(图中细字体文件),比如图中的“#address-cells"、"#size-cells"、"compatible”、"model”和"name”这5个文件,它们在设备树中就是根节点的5个属性。因此ocram节点应该是soc节点的子节点。原创 2023-06-18 00:35:15 · 1530 阅读 · 0 评论 -
03_Linux设备树与设备树语法
找到匹配的machine_desc的过程就是用设备树根节点的compatible属性值和Linux内核中machine_desc下.dt_compat的值比较,看看那个相等,如果相等的话就表示找到匹配的machine_desc, arch_get_next_mach函数的工作就是获取Linux内核中下一个machine desc结构体。使用2440这个芯片的板子有很多。设备节点的compatible属性值是为了匹配Linux内核中的驱动程序,那么根节点中的compatible属性是为了做什么工作的?原创 2023-06-17 22:50:09 · 1149 阅读 · 0 评论 -
02_LinuxLED驱动开发
第47-59行, led_switch函数,用于控制开发板上的LED灯亮灭,当参数sta为LEDON(1)的时候打开LED灯, sta为LEDOFF(0)的时候关闭LED灯。第47-59行, led_switch函数,用于控制开发板上的LED灯亮灭,当参数sta为LEDON(1)的时候打开LED灯, sta为LEDOFF(0)的时候关闭LED灯。第192-202行,驱动出口函数led_exit,首先使用函数iounmap取消内存映射,最后使用函数unregister_chrdev注销led这个字符设备。原创 2023-06-10 20:45:59 · 889 阅读 · 0 评论 -
01_Linux字符设备驱动开发
"/lib/modules”是通用的,不管你用的什么板子、什么内核,这部分是一样的。不一样的是后面的“4.1.15”,这里要根据你所使用的Linux内核版本来设置,比如ALPHA开发板现在用的是4.1.15 版本的Linux内核,因此就是"/lib/modules/4.1.15"。在Linux中一切皆为文件,驱动加载成功以后会在"/dev”目录下生成一个相应的文件,应用程序通过对这个名为"/dev/xxx”(xxx是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。如果要获取led 灯的状态。原创 2023-06-10 16:19:56 · 2324 阅读 · 1 评论