
Linux 驱动开发
文章平均质量分 60
驱动笔记
rjszcb
不断学习变成牛
展开
-
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 · 666 阅读 · 0 评论 -
Linux驱动.之驱动开发思维,设备,驱动,总线分析思想,驱动的分类(字符设备,块设备,网络设备)
添加修改不同设备的属性,比如gpio,配置输入输出模式,高低电平等等,直接调用内核,提供的api,来进行操作。驱动由厂商提供完善,总线由内核完善,设备的一部分由soc厂商完善,剩下一些配置等,由驱动开发者,进行修改移植。比如要操作i2c一个外设,就要知道外设的地址,将设备信息,添加到设备树,板卡所有的信息,都添加到设备树,来告诉内核,板卡有什么资源,启动时,就会根据设备,去寻找驱动,进行匹配。在stm32,裸机开发时,偏底层,跟寄存器打交道,有些MCU提供了库,库也还是操作寄存器的,通过配置寄存器,原创 2024-09-03 15:34:13 · 1156 阅读 · 0 评论 -
Linux驱动.之驱动相关命令insmod,lsmod,rmmod,modinfo,modprob
Linux驱动.之驱动相关命令insmod lsmod rmmod modinfo modprob。原创 2024-08-31 11:15:41 · 162 阅读 · 0 评论 -
linux驱动,之module_init,initcall 动态和静态加载驱动级别顺序,define_initcall,initcallx_start,initcall_levels的原理
接续分析,initcall_levels,哎,是不是很熟悉啊,初始化调用链表来管理的,这个链表是一个全局变量数组,称为__initcall_levles。可以看下内核对各个模块,赋予的启动级别,顺序,最先启动的是arm,arch芯片架构相关的东西,容纳后是fs文件系统,最后比较后面是驱动,device_initcall就是驱动的定义的顺序。这些个数组,不就是前面我们讲到的,轮询指针,各个数组存放了各个函数指针,数组是设置好了级别的,所一,内核启动时,按级别,一级一级的去启动。原创 2020-10-29 15:20:06 · 805 阅读 · 0 评论 -
Linux.之物理地址,虚拟地址映射 iomap iounmap
Linux.之物理地址,虚拟地址映射 iomap iounmap。原创 2024-09-11 21:10:07 · 120 阅读 · 0 评论 -
Linux.之设备树DTS(device tree source)(一)
Linux.之设备树DTS(device tree )原创 2024-09-11 21:08:44 · 852 阅读 · 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 · 538 阅读 · 0 评论 -
Linux驱动.之新内核字符设备驱动框,设备树(二)
在用户空间中调用open,打开一个字符设备,执行流程如下:最终会执行chrdev中的ops对应的open函数。在前面字符设备框架中,用的老内核,不带设备树的led驱动例子,将这个代码进行。第一篇比较长,第二篇,继续写,设备树下驱动框架。改进,添加dts设备树。原创 2024-09-08 09:17:06 · 240 阅读 · 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 · 189 阅读 · 0 评论 -
Linux驱动.之pinctl和gpio子系统驱动框架,不带设备树和带设备树(一)
本篇pinctl和gpio子系统驱动框架学习来自正点原子,原文链接:https://blog.youkuaiyun.com/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 · 719 阅读 · 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 · 2780 阅读 · 1 评论 -
Linux驱动.之platform平台总线驱动层(一)
本文参考,https://blog.youkuaiyun.com/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 · 360 阅读 · 0 评论 -
Linux驱动.之platform平台总线驱动框架(二),正点原子
第五十四章 platform设备驱动实验我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作。像I2C、SPI、LCD等这些复杂外设的驱动就不能这么去写了,Linux系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们将来最常打交道的platform设备驱动,也叫做平台设备驱动。本章我们就来学习一下Linux下的驱动分离与分层,以及platform框架下的设备驱动该如何编写。54.1 Linux驱动的分离与分层54.1.1 驱动的分隔与分离原创 2024-09-13 18:38:26 · 1010 阅读 · 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 · 385 阅读 · 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 · 591 阅读 · 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 · 1674 阅读 · 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 · 1291 阅读 · 0 评论 -
Linux驱动.之 spi 驱动框架,时序,裸机驱动示例,app应用测试(一)
原文链接,正点原子:https://blog.youkuaiyun.com/weixin_55796564/article/details/119925782原文链接:https://blog.youkuaiyun.com/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 · 1009 阅读 · 0 评论 -
linux驱动开发.之spi测试工具spidev_test源码(一)
spidev_test.c开源代码。原创 2023-11-21 15:38:30 · 3141 阅读 · 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 · 1201 阅读 · 0 评论 -
linux驱动.之 tty uart应用层例子(二)
一般读取传感器,不会去阻塞,如果读取固定字节,可能读不到这么多,这时候容易犯错,判断字节没有那么长,而丢弃,这是非常愚蠢的,没有搞清串口是流,不是包,如一个gsensor一直在发数据,以0x63开头,64个字节为一包发送出来,这时去读100个字节,如果能读到大于64个字节一包的数据,则去找63开头的一包,如果不能小于64个,则丢弃,这样效率是非常低的,设置为不阻塞,不能阻塞,而是选择1s,来查询一次,不是阻塞,read,一直在获取数据。初始化uart,比如波特率,数据位,停止位,等等。原创 2021-02-02 20:38:52 · 520 阅读 · 1 评论 -
linux驱动.之 tty uart应用层测试工具demon(一)
在开发板终端 输入指令, ./tty_uart_test -D /dev/ttyTHS1 -w 0x55 ,输出方波,即可测试uart是否发送数据,用示波器看是否有收到方波。tty_uart_test.c 测试程序。编译成二进制可执行文件后。原创 2023-11-21 15:54:33 · 318 阅读 · 0 评论 -
嵌入式驱动开发常见的协议UART,I2C,SPI区别(一)
数据在传输过程中是通过一位一位地进行传输来实现通信的,每一次的传输都是靠起始位来同步,空闲时为高电平,用下降沿来通知接收方准备接收,紧接着的就是数据位根据设置的5/6/7/8位数据来进行传输,低位在前,高位在后(LSB——MSB),数据位结束后就是奇偶校验为,校验位之后就是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。数据有效性:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。原创 2021-06-17 17:22:50 · 818 阅读 · 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 · 1002 阅读 · 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 · 1292 阅读 · 0 评论 -
Linux驱动.之中断系统.内核框架下,中断的处理request_irq,中断上下文Workqueue、Threaded IRQs、Softirq和Tasklets(三)
https://blog.youkuaiyun.com/suifen_/article/details/135434176?spm=1001.2014.3001.5502原文链接:https://blog.youkuaiyun.com/weixin_55796564/article/details/120129404开篇前workque工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。因此如果你要推后的工作可原创 2024-08-08 15:45:47 · 255 阅读 · 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 · 425 阅读 · 0 评论 -
Linux 内核,自旋锁spinlock在驱动中的使用实例 (一)
Linux内核并发同步机制,自旋锁spinlock ,信号量,互斥锁mutex,原子操作,竞争和互斥,内核抢占入临界区,详解(一)原创 2024-08-24 22:31:05 · 155 阅读 · 0 评论 -
Linux驱动,之定时器timer(一)
linux驱动,之定时器timer(一),这个是非常重要的,这个后面有时间再讲。原创 2021-07-03 11:21:31 · 346 阅读 · 0 评论 -
Linux驱动,之watchdog看门狗,应用层喂狗(一)
Linux驱动,之watchdog看门狗,应用层喂狗(一)原创 2024-08-24 22:35:59 · 227 阅读 · 0 评论 -
Linux驱动.之input输入子系统设备驱动框架(一)
原文链接:https://blog.youkuaiyun.com/weixin_55796564/article/details/120435257Input 设备驱动,操作硬件获取硬件寄存器中设备输入的数据,并把数据交给核心层,本质还是字符设备,只是比较复杂,不止fileopration,还包括核心层,事件上报,比如鼠标,就包括usb架构,套上input架构。触摸屏,通过i2c读取数据,就需要注册到i2c架构,套上input架构开篇前,讲一下,input很复杂,但是对于驱动开发不难,只需调用内核提供的,注册接原创 2022-11-20 14:37:46 · 1351 阅读 · 0 评论 -
Linux驱动.之 input i2c框架下,touch触摸屏驱动框架,以及两款芯片gslX680,ft5x0x,驱动源代码(一)
原文链接:https://blog.youkuaiyun.com/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 · 212 阅读 · 0 评论 -
Linux驱动,之input驱动,移植与编译tslib库,应用层,调用库来读取触摸屏坐标(二)
在酝酿原创 2021-07-03 10:59:34 · 136 阅读 · 0 评论 -
Linux驱动.之PWM驱动及应用编程(一)
Linux驱动.之PWM驱动及应用编程(一)原创 2024-08-10 00:27:42 · 115 阅读 · 0 评论 -
Linux驱动.之LCD,一文讲解,时序,framebuffer驱动框架不带dts和带dts版本(一)
本文比较长,一文讲解完lcd的知识,非常深入的讲解了lcd,开发lcd驱动。工作很多年后,很多文章是近期写的,以前记录在别的文档,所以比起大学期间,和前几年的理解,现在的理解,就是降维打击,以前很多东西学过,开发过,都不记得了,现在有空来记录一下,有些太过核心的,没有公开,私密。目录1、lcd接口,显示原理2、lcd时序图3、lcd各个时钟计算公式4、soc寄存器设置,lcd时序设置5、编写函数画像素点,显示画图原理6、frambufer框架7、新内核,带dts,frambufer框架一原创 2024-08-09 23:57:02 · 283 阅读 · 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 · 1001 阅读 · 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 · 274 阅读 · 0 评论 -
Linux驱动.之RTC驱动框架及应用编程(一)
看名字就知道rtc_class_ops操作集合中的这些函数是做什么的了,但是我们要注意,rtc_class_ops中的这些函数只是最底层的RTC设备操作函数,并不是提供给应用层的file_operations函数操作集。应用程序可以通过ioctl函数来设置/读取时间、设置/读取闹钟的操作,那么对应的rtc_dev_ioctl函数就会执行, rtc_dev_ioctl最终会通过操作rtc_class_ops中的read_time、set_time等函数来对具体RTC设备的读写操作。原创 2024-08-10 00:29:23 · 274 阅读 · 0 评论 -
Linux驱动.之电源管理power maneger(一)
Linux驱动.之电源管理power maneger(一),有空写。原创 2024-08-31 08:02:34 · 183 阅读 · 0 评论 -
Linux驱动.之模拟数字ADC驱动及应用编程(一)
Linux驱动.之模拟数字ADC驱动及应用编程(一)原创 2024-08-10 00:25:14 · 147 阅读 · 0 评论