Linux 驱动开发
文章平均质量分 54
驱动笔记
rjszcb
不断学习变成牛
展开
-
Linux驱动.之MT7601,USB-WiFi网卡移植到X210开发板,wpa_supplicant配置工具的使用(一)
在x210_usb-wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/common/rtusb_dev_id.c文件中的rtusb_dev_id[ ]数组里,列出了该驱动所支持的USB的VID和PID。(1)在x210_usb-wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/config.mk文件中,搜索“HAS_WPA_SUPPLICANT”,确保“HAS_WPA_SUPPLICANT=y”。原创 2024-09-22 21:42:58 · 1396 阅读 · 0 评论 -
Linux驱动.之framebufer,lcd,应用层按触摸进行翻页,画图显示bmp,jpeg,png图片(二)
bmp.h#ifndef __BMP_H__#define __BMP_H__// BMP 文件头typedef struct { // unsigned short bfType; // 2 unsigned long bfSize; // 4 unsigned short bfReserved1; unsigned short bfReserved2;原创 2024-09-21 21:59:15 · 926 阅读 · 0 评论 -
stm32驱动开发与linux驱动的区别
如下设置gpio模式,定义好结构体 GPIO_InitTypeDef GPIO_InitStructure,设置好模式,只需将gpiof传给api,就可以设置到gpio f。下图,定义了gpio E的基地址,只要将这个地址强制转换成gpiotypedf的类型,解析时,结构体地址就会自增。其实linux也是一样的,这部分有linux官方已经定义好统一的接口,芯片厂商,调用接口,对接自己的gpio,寄存器,设置好就可以了。有些不按gpio的标准写驱动,和stm32一样,直接操作寄存器。原创 2024-09-09 22:02:07 · 550 阅读 · 0 评论 -
Linux驱动.之驱动开发思维,设备,驱动,总线分析思想,驱动的分类(字符设备,块设备,网络设备)
添加修改不同设备的属性,比如gpio,配置输入输出模式,高低电平等等,直接调用内核,提供的api,来进行操作。驱动由厂商提供完善,总线由内核完善,设备的一部分由soc厂商完善,剩下一些配置等,由驱动开发者,进行修改移植。比如要操作i2c一个外设,就要知道外设的地址,将设备信息,添加到设备树,板卡所有的信息,都添加到设备树,来告诉内核,板卡有什么资源,启动时,就会根据设备,去寻找驱动,进行匹配。在stm32,裸机开发时,偏底层,跟寄存器打交道,有些MCU提供了库,库也还是操作寄存器的,通过配置寄存器,原创 2024-09-03 15:34:13 · 1018 阅读 · 0 评论 -
Linux驱动面试高频考点后面继续改整理
EXPORT_SYMBOL宏:通过使用EXPORT_SYMBOL宏,可以将一个符号(函数、变量)标记为公共可见的,在编译时生成相应的符号表信息,使其他模块或驱动程序能够访问和使用这个符号。通过GPIO引脚,可以实现对各种外设的控制,如LED、按键、传感器等。在Linux内核中,总线可以是物理总线(如PCI、USB等),也可以是虚拟总线(如platform、SPI、I2C等)。在设备模型中,每个设备都被表示为一个struct device结构体,包含了与该设备相关的信息,例如设备名称、资源信息、驱动程序等。原创 2024-08-11 16:00:36 · 925 阅读 · 0 评论 -
Linux系统调用
转载自:https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.htmlLinux系统调以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。其中有一些函数的作用完全相同,只是参数不同。(可能很多熟悉C++朋友马上就能联想起函数重载,但是别忘了Linux核心是用C语言写的,所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警转载 2020-11-08 22:21:37 · 142 阅读 · 0 评论 -
Linux驱动.之驱动相关命令insmod,lsmod,rmmod,modinfo,modprob
Linux驱动.之驱动相关命令insmod lsmod rmmod modinfo modprob。原创 2024-08-31 11:15:41 · 118 阅读 · 0 评论 -
Linux内核.之驱动模块的启动机制module_init,__initcallx_start,attribute(一)
原文链接:https://blog.csdn.net/weixin_45499326/article/details/131370815。头文件在include/linux/init.h。module_init宏。原创 2024-08-25 21:29:12 · 92 阅读 · 0 评论 -
Linux驱动的启动机制(一)
常说用module_init()宏来标识初始化函数lcd_init(),函数lcd_init是这个驱动模块的一个入口。这里就来解释,这个入口是如何实现的。*module_init()将在do_initcalls()期间(如果是内置的)或在模块插入时(如果是模块)调用。这个宏是如何在内核初始化时被调用的,或是在模块被插入时(insmod命令)被调用的。首先,把宏module_init()一层层展开,来看这个宏到底做了什么。x:在内核启动时或模块插入时运行的函数。1、module_init宏。原创 2024-08-24 22:35:59 · 187 阅读 · 0 评论 -
linux驱动的动态加载和静态加载
linux驱动,加载时,有两种方式启动内核时,会加载编译进内核的驱动,另一种是,动态加载,在外边单独编译ko,使用insmod加载ko详细,在酝酿。原创 2021-07-03 11:21:31 · 302 阅读 · 0 评论 -
_initcall 加载驱动顺序级别
#define pure_initcall(fn) __define_initcall(“0”,fn,0)#define core_initcall(fn) __define_initcall(“1”,fn,1)#define core_initcall_sync(fn) __define_initcall(“1s”,fn,1s)#define postcore_initcall(fn) __define_initcall(“2”,fn,2)#define postcore_initcall_syn原创 2020-10-29 15:20:06 · 650 阅读 · 0 评论 -
Linux.之设备树DTS(device tree source)(一)
Linux.之设备树DTS(device tree )原创 2024-09-11 21:08:44 · 403 阅读 · 0 评论 -
Linux.之物理地址,虚拟地址映射 iomap iounmap
Linux.之物理地址,虚拟地址映射 iomap iounmap。原创 2024-09-11 21:10:07 · 90 阅读 · 0 评论 -
Linux驱动.之字符设备驱动框架,及手动,自动注册创建/dev下设备节点详解(一)
可以看出分配的结构体指针数组有255个元素,由于有的主设备号大于254,故需要除以255取余,这样,当主设备号为256时,除以255取余为1,故存在数组chrdev[1]中,但chrdev也可存主设备号为1的元素,故使用链表,使主设备号为1的char_device_struct的next成员指向主设备号为256的char_device_struct。用 ls -l命令可以看到如下的显示:sda,sda1是磁盘设备的节点,8就是主设备号,后面的0,1 ,2 就是次设备号,有好几个分区。原创 2024-08-24 00:48:03 · 326 阅读 · 0 评论 -
Linux驱动.之新内核字符设备驱动框,设备树(二)
在用户空间中调用open,打开一个字符设备,执行流程如下:最终会执行chrdev中的ops对应的open函数。在前面字符设备框架中,用的老内核,不带设备树的led驱动例子,将这个代码进行。第一篇比较长,第二篇,继续写,设备树下驱动框架。改进,添加dts设备树。原创 2024-09-08 09:17:06 · 181 阅读 · 0 评论 -
Linux内核.之kobj ,struct file、struct inode、struct file_operations、struct cdev之间的关系
这就达到一个目的,当应用的任何一个操作设备文件的指令,如read(fd) , write(fd)等,都可以通过文件描述符表数组的fd下标对应的元素找到内核 的file_operations结构体指针,这样就可以调用该结构体内对应.read()和.write()的成员函数指针,从而完成实质的对字符设备的读,写操作。在/sys目录下,bus用于存放各类总线,其中总线中会存放挂载在该总线上的驱动和设备,比如serial8250,devices存放了系统中的设备信息,class是针对不同的设备进行分类;原创 2024-08-30 21:03:13 · 130 阅读 · 0 评论 -
Linux驱动.之pinctl和gpio子系统驱动框架,不带设备树和带设备树(一)
本篇pinctl和gpio子系统驱动框架学习来自正点原子,原文链接:https://blog.csdn.net/weixin_55796564/article/details/120033581一、首先,简单的,裸机模式,直接操作寄存器例子1、gpio接口输出高低电平,控制led,不带设备树,有时候项目开发,也是可以直接操作的#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>原创 2021-01-23 18:36:26 · 576 阅读 · 0 评论 -
Linux下控制GPIO的三种方法,以及HI3559AV100 GPIO配置和操作(一)
在/sys/class/gpio/下有个export文件,向export文件写入要操作的GPIO号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO输入或者输出模式,而value可控制GPIO的状态或者读取状态。前面同事写的,这个脚本里,没有找到使用它,结果在sdk的 out/liteos/single/init/sdk_init.c找到了,复用为了gesonser的clk,靠,原创 2021-01-23 14:02:14 · 2378 阅读 · 0 评论 -
Linux驱动.之platform平台总线驱动层(一)
本文参考,https://blog.csdn.net/suifen_/article/details/135256555?spm=1001.2014.3001.5502内核版本:Linux 2.6设备驱动,分离与分层一、 platform总线、设备与驱动概念在Linux 2.6的设备驱动模型中,平台总线模型就是把原来的驱动C文件给分成两个C文件,一个是device.c,一个是driver.c,设备驱动分离思想。关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个原创 2024-08-08 15:37:34 · 273 阅读 · 0 评论 -
Linux驱动.之platform平台总线驱动框架(二),正点原子
第五十四章 platform设备驱动实验我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作。像I2C、SPI、LCD等这些复杂外设的驱动就不能这么去写了,Linux系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们将来最常打交道的platform设备驱动,也叫做平台设备驱动。本章我们就来学习一下Linux下的驱动分离与分层,以及platform框架下的设备驱动该如何编写。54.1 Linux驱动的分离与分层54.1.1 驱动的分隔与分离原创 2024-09-13 18:38:26 · 941 阅读 · 0 评论 -
Linux驱动.之platform平台总线驱动框架,新内核带设备树(二)
第189~196行,platform_driver驱动结构体,191行设置这个platform驱动的名字为“imx6ul-led”,因此,当驱动加载成功以后就会在/sys/bus/platform/drivers/目录下存在一个名为“imx6u-led”的文件。在使用设备树的时候,设备已经准备好了,接下来就要编写相应的platform驱动了,新建名为“18_dtsplatform”的文件夹,然后在18_dtsplatform文件夹里面创建vscode工程,工作区命名为“dtsplatform”。原创 2024-08-24 00:44:03 · 299 阅读 · 0 评论 -
Linux驱动.之I2C,iic驱动层.时序篇(一)
作者原地址,https://www.cnblogs.com/alantu2018/p/8994719.html本文,阐述i2c时序图,和C语言模拟 产生IIC时序,读写数据。一、IIC 总线概述:IIC 即Inter-Integrated Circuit(集成电路总线)I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主原创 2022-05-25 15:52:53 · 345 阅读 · 0 评论 -
Linux驱动.之I2C,iic驱动框架,不带设备树和带设备树,以及老接口,新接口platform下(二)
一、 Linux下IIC驱动架构1、首先说说,单片机,的i2c硬件接口图,一个i2c接口,通过sda和scl总线,外接了多个设备device,通过单片机,来控制i2c的信号发生,控制器件,所以,我们需要写起始信号,停止信号,应对信号,数据发送函数等等。2、Linux定义了系统的IIC驱动体系结构,在Linux系统中,IIC驱动由3部分组成,IIC核心层、IIC总线层 ,IIC设备驱动层。这3部分相互协作,形成了非常通用、可适应性很强的IIC框架。3、linux与单片机linux与单片机的对比,原创 2024-08-07 12:28:41 · 1209 阅读 · 0 评论 -
Linux驱动.之I2C,iic驱动框架,之应用开发,以及i2c-tools工具使用(二)
工具安装,i2c-tools工具是一个专门调试i2c的,开源,可获取挂载的设备及设备地址,还可以在对应的设备指定寄存器设置值或者获取值等功能。0x36为I2C设备的地址, 0x300A为要读的寄存器地址, r3为连续读3Byte, 0x56 0x08 0x41 为读到的寄存器的值。1,上面有UU和和数字显示,UU表示此地址已经加载了驱动,具体有没有设备不一定,显示有数字说明探测到设备了,也可能是系统的,不知是谁的。如:i2ctransfer -f -y 1 w3@0x36 0x50 0x81 0x01。原创 2023-09-26 15:22:46 · 1099 阅读 · 0 评论 -
Linux驱动.之 spi 驱动框架,时序,裸机驱动示例,app应用测试(一)
原文链接,正点原子:https://blog.csdn.net/weixin_55796564/article/details/119925782原文链接:https://blog.csdn.net/weixin_47397155/article/details/122914110目录、1、spi,裸机开发,驱动六轴传感器2、spi时序3、linux spi驱动框架一、1、spi 裸机驱动同I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口,SPI接口的原创 2023-02-02 17:46:11 · 702 阅读 · 0 评论 -
linux驱动开发.之spi测试工具spidev_test源码(一)
spidev_test.c开源代码。原创 2023-11-21 15:38:30 · 2122 阅读 · 0 评论 -
Linux驱动.之 tty uart串口驱动框架(一)
奇校验时,发送方应使数据位中1的个数与校验位中1的个数之和为奇数;在上面讲解uart_port的时候说过,uart_port中的ops成员变量很重要,因为ops包含了针对UART具体的驱动函数,Linux系统收发数据最终调用的都是ops中的函数。完成以后重新编译设备树并使用新的设备树启动Linux,如果设备树修改成功的话,系统启动以后就会生成一个名为“/dev/ttymxc2”的设备文件,ttymxc2就是UART3对应的设备文件,应用程序可以通过访问ttymxc2来实现对UART3的操作。原创 2023-11-23 20:51:52 · 772 阅读 · 0 评论 -
linux驱动.之 tty uart应用层例子(二)
一般读取传感器,不会去阻塞,如果读取固定字节,可能读不到这么多,这时候容易犯错,判断字节没有那么长,而丢弃,这是非常愚蠢的,没有搞清串口是流,不是包,如一个gsensor一直在发数据,以0x63开头,64个字节为一包发送出来,这时去读100个字节,如果能读到大于64个字节一包的数据,则去找63开头的一包,如果不能小于64个,则丢弃,这样效率是非常低的,设置为不阻塞,不能阻塞,而是选择1s,来查询一次,不是阻塞,read,一直在获取数据。初始化uart,比如波特率,数据位,停止位,等等。原创 2021-02-02 20:38:52 · 435 阅读 · 1 评论 -
linux驱动.之 tty uart应用层测试工具demon(一)
在开发板终端 输入指令, ./tty_uart_test -D /dev/ttyTHS1 -w 0x55 ,输出方波,即可测试uart是否发送数据,用示波器看是否有收到方波。tty_uart_test.c 测试程序。编译成二进制可执行文件后。原创 2023-11-21 15:54:33 · 219 阅读 · 0 评论 -
嵌入式驱动开发常见的协议UART,I2C,SPI区别(一)
数据在传输过程中是通过一位一位地进行传输来实现通信的,每一次的传输都是靠起始位来同步,空闲时为高电平,用下降沿来通知接收方准备接收,紧接着的就是数据位根据设置的5/6/7/8位数据来进行传输,低位在前,高位在后(LSB——MSB),数据位结束后就是奇偶校验为,校验位之后就是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。数据有效性:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。原创 2021-06-17 17:22:50 · 620 阅读 · 1 评论 -
Linux驱动.之中断系统,裸机下设置寄存器,绑定中断处理函数hander(一)
Linux驱动.之中断,外部中断,内部中断控制器,本篇讲1、arm裸机,轮询的方式,点亮led2、ARM裸机 通过按键,中断的方式,点了led灯,3、单片机,中断的方式4、CPU。裸机,的中断系统一、在开始前,先回顾下51单片机中断,单片机有5个中断,1个uart中断,2个定时器中断,2个外部中断,在发生中断时,单片机内部会自动跳转到hander处理函数,怎么实现的,不知道,是不是硬件自动跳转到中断处理函数的,还是软件查询后,去跳转,找到中断处理函数的。如下,定时器,点了led灯#incl原创 2024-08-09 12:45:37 · 898 阅读 · 0 评论 -
Linux驱动.之中断系统,裸机下设置寄存器,绑定中断处理函数hander(二)
不同的中断源对应不同的中断处理函数,I.MX6U有160个中断源,所以需要160个中断处理函数,我们可以将这些中断处理函数放到一个数组里面,中断处理函数在数组中的标号就是其对应的中断号。一个中断源就需要一个sys_irq_handle_t变量,I.MX6U有160个中断源,因此需要160个sys_irq_handle_t组成中断处理数组。第17行定了中断服务函数数组irqTable,这是一个sys_irq_handle_t类型的结构体数组,数组大小为I.MX6U的中断源个数,即160个。原创 2024-09-16 16:25:24 · 1225 阅读 · 0 评论 -
Linux驱动.之中断系统.内核框架下,中断的处理request_irq,中断上下文Workqueue、Threaded IRQs、Softirq和Tasklets(三)
https://blog.csdn.net/suifen_/article/details/135434176?spm=1001.2014.3001.5502原文链接:https://blog.csdn.net/weixin_55796564/article/details/120129404开篇前workque工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。因此如果你要推后的工作可原创 2024-08-08 15:45:47 · 140 阅读 · 0 评论 -
Linux 驱动.之字符设备框架下按键(kill_fasync,fasync,fasync_helper,signal)中断异步信号通知应用层方式 不带设备树
在这个例子中:当mydev_read()有数据可读时,它调用mydev_handler(),mydev_handler()调用kill_fasync(),传入&async_queue异步通知链表,kill_fasync()遍历该链表,对每个回调都发送SIGIO信号,注册的进程收到SIGIO信号,知道有数据可读,进行读取。当异步事件发生时,驱动调用kill_fasync(),该函数会遍历fp链表中的所有回调,对每个回调,向对应的进程发送sig信号,这样,注册的进程就收到通知,进行后续IO操作。原创 2021-02-02 20:31:03 · 205 阅读 · 0 评论 -
Linux 内核,自旋锁spinlock在驱动中的使用实例 (一)
Linux内核并发同步机制,自旋锁spinlock ,信号量,互斥锁mutex,原子操作,竞争和互斥,内核抢占入临界区,详解(一)原创 2024-08-24 22:31:05 · 124 阅读 · 0 评论 -
Linux驱动.之input输入子系统设备驱动框架(一)
原文链接:https://blog.csdn.net/weixin_55796564/article/details/120435257Input 设备驱动,操作硬件获取硬件寄存器中设备输入的数据,并把数据交给核心层,本质还是字符设备,只是比较复杂,不止fileopration,还包括核心层,事件上报,比如鼠标,就包括usb架构,套上input架构。触摸屏,通过i2c读取数据,就需要注册到i2c架构,套上input架构开篇前,讲一下,input很复杂,但是对于驱动开发不难,只需调用内核提供的,注册接原创 2022-11-20 14:37:46 · 1079 阅读 · 0 评论 -
Linux驱动.之 input i2c框架下,touch触摸屏驱动框架(一)
原文链接:https://blog.csdn.net/weixin_55796564/article/details/120470202一、touch触摸屏硬件原理1、裸机下,iic接口,驱动触摸屏。本章实验在上一章例程的基础上完成,更改工程名字为“touchscreen”,用到的i2c接口,回去看,这里不展示,然后在bsp文件夹下创建名为“touchscreen”的文件。代码,只将如何设置驱动一个触摸屏。在bsp/ touchscreen中新建bsp_ft5xx6.c和bsp_ft5xx6原创 2022-11-20 14:33:34 · 171 阅读 · 0 评论 -
Linux驱动.之LCD,framebuffer驱动分析及实战(一)
Linux驱动.之LCD,framebuffer驱动分析及实战(一)原创 2024-08-09 23:57:02 · 68 阅读 · 0 评论 -
基于s3c2440的12864液晶驱动
通过class_create和device_create生成并注册一个逻辑设备,通过此工作,可以在/dev/下面看到设备名;以上主要工作是:通过register_chrdev_region静态分配设备号devno,如果分配失败,则通过系统alloc_chrdev_region动态分配;因为公司结构方面的需要,要将液晶倒转显示,所以此处做了两个不同的方案,如果定义了NORMAL,则正常显示,否则倒转显示;引脚定义:D0-D7,RS,RES,RD,WR,CS,BL;以上则是液晶屏的驱动程序,很简单吧?原创 2022-11-20 14:32:18 · 244 阅读 · 0 评论 -
Linux驱动.之PWM驱动及应用编程(一)
Linux驱动.之PWM驱动及应用编程(一)原创 2024-08-10 00:27:42 · 98 阅读 · 0 评论