嵌入式驱动开发
文章平均质量分 79
朱有鹏嵌入式开发课程
正在起飞的蜗牛
这个作者很懒,什么都没留下…
展开
-
RK3568芯片开发笔记——调试pwm控制红外功能
pwm功能调试5、设备树里pwm配置6、/proc/device-tree8、内核里各处pwm控制器信息的联系9、配置pwm功能步骤10、配置pwm11为例10.1、在设备树里开启pwm1110.3、通过sys文件系统来控制pwm11原创 2023-04-24 22:16:51 · 2318 阅读 · 1 评论 -
SPI协议详解(Standard SPI、Dual SPI和Queued SPI)
(1)通常我们说的SPI就是Standard SPI,有4根信号线,分别为CLK、CS、MOSI和MISO,也就是上面介绍的SPI协议;(2)Dual SPI:只是针对SPI Flash而言,不是针对所有SPI外设。对于SPI Flash,全双工并不常用,因此扩展了mosi和miso的用法,让它们工作在半双工,用以加倍数据传输。原创 2023-02-16 09:00:00 · 37306 阅读 · 5 评论 -
向Linux内核添加驱动的步骤详解
(1)驱动源码一般都是从设备厂商处获取;(2)设备厂商给的驱动源码大体上是没有问题的,能加载但是效果不一定好,需要根据自己的板子进行适配;原创 2022-12-29 15:40:14 · 7944 阅读 · 0 评论 -
linux内核的块设备驱动框架详解
* 要传输的第一个扇区 */ 4 struct bio * bi_next;/* 下一个 bio */ 5 struct block_device * bi_bdev;/* 状态、命令等 */ 7 unsigned long bi_rw;/* 低位表示 READ/WRITE,高位表示优先级*/ 8 struct bvec_iter bi_iter;/* 迭代器,标明数据要操作的块设备的位置 */ 9 unsigned short bi_vcnt;...原创 2022-08-06 22:20:49 · 3145 阅读 · 0 评论 -
gslx680触摸屏驱动源码码分析(gslX680.c)
I2C子系统原创 2022-07-05 00:02:55 · 2400 阅读 · 0 评论 -
linux内核I2C子系统详解——看这一篇就够了
I2C子系统原创 2022-07-04 23:46:32 · 7361 阅读 · 0 评论 -
S5PV210芯片I2C适配器驱动分析(i2c-s3c2410.c)
I2C子系统原创 2022-07-03 23:32:53 · 555 阅读 · 0 评论 -
I2C子系统之适配器的设备接口分析(i2c-dev.c文件分析)
I2C子系统原创 2022-07-03 23:25:42 · 1010 阅读 · 0 评论 -
内核中时间相关的知识介绍
内核中时间相关的操作原创 2022-07-03 23:15:45 · 704 阅读 · 0 评论 -
中断的顶半部和底半部介绍以及实现方式(tasklet 和 工作队列)
中断上下半部原创 2022-07-03 23:05:53 · 1997 阅读 · 0 评论 -
I2C驱动实现的两种思路(i2c-dev.c和i2c-core.c)
I2C驱动原创 2022-06-19 16:35:34 · 2099 阅读 · 0 评论 -
linux输入子系统详解——看这一篇就够了
linux内核输入子系统详解原创 2022-06-05 18:28:04 · 4440 阅读 · 1 评论 -
内核中的位图介绍(DECLARE_BITMAP宏)
1、DECLARE_BITMAP宏定义#define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) //向上取整#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))#define DECLARE_BITMAP(name,bits) unsigned long name[BITS_TO_LONGS(bits)](1)位图:用每一个bit来表示一个含义。比如你需要原创 2022-05-18 22:55:50 · 1784 阅读 · 0 评论 -
LCD驱动源码分析(s3cfb.c)
1、驱动源码分析大致思路(1)分析LCD驱动首先需要分析内核的帧缓冲子系统,因为LCD驱动就是按照帧缓冲子系统提供的注册接口来注册的;(2)内核帧缓冲子系统参考博客:https://blog.csdn.net/weixin_42031299/article/details/124904906(3)先分析LCD驱动的加载和卸载;(4)梳理清楚应用是如果调用到LCD驱动的;(5)LCD驱动的源码大致分为两部分:一部分是Soc的LCD控制器,一方面是LCD本身,两者都是去查阅数据手册;(6)LCD和原创 2022-05-25 22:44:46 · 1026 阅读 · 0 评论 -
linux显示启动logo源码分析以及修改显示logo
1、linux显示启动logo整个流程分析(1)logo图片在内核源码中是以ppm格式的文件保存,在编译内核时会把ppm格式的文件自动转换成.c文件,在c文件中会构造一个struct linux_logo结构体变量,变量名字就是文件的名字,struct linux_logo结构体在内核中用来表示一副logo图像信息;(2)内核在初始化显示器后,会按照配置去匹配合适的struct linux_logo结构体,也就是查找logo图片;(3)将logo图像显示到默认屏幕上;2、linux显示启动lo原创 2022-05-25 22:40:18 · 5132 阅读 · 0 评论 -
Linux 帧缓冲子系统详解:LCD介绍、framebuffer驱动框架、LCD驱动源码分析
LCD显示屏基础知识介绍请看博客:《嵌入式开发(S5PV210)——LCD显示器》;原创 2022-05-22 23:05:17 · 1963 阅读 · 0 评论 -
hisi3516dv300芯片基于hwmon驱动框架的温度获取驱动源码分析
1、内核hwmon驱动框架参考博客:《内核hwmon驱动框架详解以及海思芯片温度驱动分析》;2、驱动实现的效果/sys/devices/virtual/hwmon/hwmon0 # pwd/sys/class/hwmon/hwmon0/sys/devices/virtual/hwmon/hwmon0 # lspower subsystem temp1_input uevent/sys/devices/virtual/hwmon/hwmon0 # cat temp1_i原创 2022-05-21 22:05:26 · 1912 阅读 · 1 评论 -
内核hwmon驱动框架详解以及海思芯片温度驱动分析
1、hwmon驱动框架介绍hwmon即hardware monitoring framework,硬件监视框架。可以把温度传感器、风扇、电源管理等设备的驱动都利用hwmon框架去实现,在设备的归类上比较容易理解。2、hwmon驱动框架分析2.1、hwmon驱动框架加载、卸载机制//hwmon驱动框架的加载函数static int __init hwmon_init(void){ ······}//hwmon驱动框架的卸载函数static void __exit hwmon_exit原创 2022-05-21 21:59:32 · 1452 阅读 · 0 评论 -
内核hwmon驱动框架详解以及海思芯片温度驱动分析
1、hwmon驱动框架介绍hwmon即hardware monitoring framework,硬件监视框架。比如可以把温度传感器、风扇、电源管理等设备的驱动都利用hwmon框架去实现,在设备的归类上比较容易理解。2、hwmon驱动框架分析2.1、hwmon驱动框架加载、卸载机制//hwmon驱动框架的加载函数static int __init hwmon_init(void){ ······}//hwmon驱动框架的卸载函数static void __exit hwmon_ex原创 2022-05-21 00:20:10 · 1291 阅读 · 1 评论 -
SENSOR_DEVICE_ATTR宏分析
1、SENSOR_DEVICE_ATTR宏定义#define SENSOR_DEVICE_ATTR(_name, _mode, _show, _store, _index) \struct sensor_device_attribute sensor_dev_attr_##_name = SENSOR_ATTR(_name, _mode, _show, _store, _index)该宏是用来定义一个struct sensor_device_attribute类型的变量,并初始化;2、SEN原创 2022-05-21 00:17:06 · 1273 阅读 · 0 评论 -
内核的misc驱动框架详解:内核源码分析、蜂鸣器驱动分析
1、什么是misc类设备(1)misc类设备就是杂项类设备,那些功能不太复杂,不太好归类到已经创建好的类中,这些设备都可以归类到misc类设备。misc类设备就好像一个收纳盒子,不知道怎么归类的设备就归类到misc类设备里;(2)misc类设备本质上是字符类设备,而且归类是建议不是强制,你想把设备归到哪一类设备都是可以的,只有按照相应驱动框架的注册方式去注册驱动,但是良好的归类习惯,能让人更容易理解你写的代码;2、misc驱动框架的加载static const struct file_opera原创 2022-05-19 22:38:31 · 616 阅读 · 0 评论 -
内核platform总线详解:定义、注册、匹配、使用示例
1、总线式设备驱动组织方式1.1、总线(1)外设与Soc连接都是通过接口,不同的接口本质就是通信协议不一样,随着内核要管理的设备越来越多,于是抽象出各种总线,希望将同一接口协议的设备连接在一起管理;(2)总线分为物理总线和虚拟总线。物理总线是客观上存在的,比如usb总线,是真的有usb协议的设备连接在上面;虚拟总线是软件上模拟的,比如platform总线,没有哪种设备用的是platform协议,是内核为了统一用总线上方式管理设备虚拟出来的总线;(3)使用总线的好处:实现数据和方法的分离,设备里包含原创 2022-05-18 22:53:24 · 1119 阅读 · 1 评论 -
gpio子系统在sysfs中构建leds类
1、内核配置CONFIG_GPIO_SYSFS=yCONFIG_GPIOLIB=y(1)CONFIG_GPIO_SYSFS:决定sysfs是否支持gpio子系统,也就是能否在"/sys/class/“目录下看到gpio类;(2)CONFIG_GPIOLIB:决定是否将”/drivers/gpio/gpiolib.c"编译进内核,如果选择否则在内核和驱动中不能使用gpio子系统相关的函数接口;总结:CONFIG_GPIOLIB一般都是选择y,因为其他驱动会用到内核gpio子系统;CONFIG_G原创 2022-05-15 21:22:05 · 980 阅读 · 0 评论 -
Linux驱动调试中的Debugfs的使用简介
1、内核配置开启debugfs(1)debugfs文件系统是基于内存的虚拟文件系统,用于内核的调试,以文件的方式呈现内核中的数据;(2))在内核配置文件中修改"CONFIG_DEBUG_FS=y";或者"make menuconfig"中选中"Debug Filesystem";2、挂载debugfs系统(1)利用mount命令去挂载debugfs文件系统,上面的命令就是将debugfs文件系统挂载到"/tmp/debugfs"目录;(2)最好是自己新建一个目录去挂载,不要去挂碍已经有文原创 2022-05-15 21:16:19 · 3847 阅读 · 0 评论 -
应用层通过/sys/class/gpio文件操作gpio口
1、内核gpio子系统介绍应用层通过sysfs操作gpio的前提是内核中已经向gpio子系统注册了gpio资源,并且在/sys/class/目录下可以看到gpio类。详细情况参考博客:《2.6.35内核的gpio子系统详解》;2、/sys/class/gpio目录(1)gpio资源对上层应用是以文件的形式呈现的,应用操作gpio口就是读写相应的文件;(2)gpiochipxx:每个文件夹对应一个端口,名字的末尾是端口中第一个gpio口在内核中的编号;(3)每个gpiochipxx文件夹下原创 2022-05-15 20:50:58 · 3160 阅读 · 1 评论 -
内核的IO模型详解
1、什么是I/O?(1)I/O系统就是操作系统负责输入、输出信息的系统,也可以说是整个操作系统数据交换与人机交互的通道。比如常见的键盘、鼠标、显示屏就是I/O设备;(2)数据输入:外部IO设备把数据输入到内存;数据输出:内存中的数据输出到I/O设备;2、提高I/O性能的方法(1)从硬件上着手,提高I/O设备本身的读写速度。比如将机械硬盘换成固态硬盘,就可以明显提高读写速度;但是硬件有自己的物理特性,不是想提高就能提高的;(2)从软件上着手,给I/O设备添加缓冲区,减少CPU操作I/O设备的原创 2022-05-14 21:59:23 · 480 阅读 · 0 评论 -
2.6.35内核的gpio子系统详解
1、内核gpio子系统介绍1.1、gpio子系统为驱动程序提供的服务(1)系统中GPIO信息的管理,比如有多少个GPIO,每个GPIO的编号是什么等;(2)GPIO的申请、释放;(3)IO的输入、输出方向的设置;IO电平的输出或者输入设置;以及GPIO与中断号的相互转换;(4)DTS中关于GPIO相关的配置信息的解析;(5)gpio系统与sysfs文件系统的交互;(6)gpio系统与debugfs文件系统的交互等。1.2、gpio子系统为Soc芯片的gpio控制器提供的服务(1)GP原创 2022-05-11 22:58:53 · 2058 阅读 · 0 评论 -
驱动程序如何支持非阻塞读写操作
1、应用层指定非阻塞模式fd=open("/dev/xxx",O_RDONLY | O_NONBLOCK);在open打开设备节点时,指定打开方式为非阻塞打开(O_NONBLOCK);2、驱动代码感知当前操作方式struct file { ······ unsigned int f_flags; //记录文件的属性,比如:O_NONBLOCK 非阻塞 fmode_t f_mode; //记录文件的打开方式,比如:O_RDONLY 只读 ······};(1)在open打原创 2022-05-10 23:24:47 · 253 阅读 · 0 评论 -
内核LED驱动框架讲解以及led设备注册示例代码
1、驱动框架介绍(1)内核中驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架。(2)内核维护者在内核中设计了一些统一管控系统资源的体系,这些体系让内核能够对资源在各个驱动之间的使用统一协调和分配,保证整个内核的稳定健康运行。譬如系统中所有的GPIO就属于系统资源,每个驱动模块如果要使用某个GPIO就要先调用特殊的接口先申请,申请到后使用,使用完后要释放。原创 2022-05-10 23:20:51 · 898 阅读 · 0 评论 -
用LED驱动框架注册led设备的示例代码
1、LED驱动框架分析参考博客:2、简单的用LED驱动框架注册led设备的代码#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h>#include <linux/leds.h>#include <mach/regs-gpio.h>#include <mach/gpio-bank.h>#include <linux/原创 2022-05-10 23:15:47 · 644 阅读 · 2 评论 -
struct class结构体
1、struct class结构体介绍struct class结构体用来在/sys/class目录下描述一个类,将来同类的设备都放在一个类下面,作为类的一个设备;参考博客:《字符设备驱动程序自动创建设备节点详解》;2、struct class结构体定义struct class { const char *name; // 类名称 struct module *owner; // 类所属的模块,比如 usb模块原创 2022-05-10 23:14:14 · 698 阅读 · 2 评论 -
信号驱动I/O详解
1、Linux中的信号1.1、查看信号[centos6-jk128:latest ~]$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 1原创 2022-05-09 23:07:57 · 1134 阅读 · 0 评论 -
进程的休眠与唤醒(等待队列)
1、进程休眠(1)进程有三种基本状态:就绪态、阻塞态、运行态。<1>阻塞态:进程缺少除了CPU之外的某些资源,因此该进程不能被运行,被阻塞住了不能被CPU调度;<2>就绪态:进程分配到了除CPU之外的所有资源,等待CPU调度执行;<3>运行态:进程获得CPU资源,程序在CPU上运行;(2)进程休眠:进程休眠就是进程因为缺少除了CPU之外的某些资源而进入阻塞态,会从调度器的运行队列中移走该进程,并把进程放到等待资源的队列中,直到分配到资源从而被唤醒,再次进入到就原创 2022-05-06 22:45:54 · 4309 阅读 · 0 评论 -
access_ok()函数介绍
access_ok()函数//函数原型int access_ok(int type, const void __user *addr, unsigned long size);(1)返回值:布尔值,1表示成功,0表示失败;(2)type:检查用户空间地址的权限;VERIFY_READ或者VERIFY_WRITE;<1>VERIFY_READ:驱动是否可以读取用户空间的指定地址;<2>VERIFY_WRITE:驱动是否可以读取用户空间的指定地址;<3>VE原创 2022-05-05 23:21:35 · 1721 阅读 · 0 评论 -
put_user()函数和get_usr()函数介绍
1、使用的场景(1)内核地址空间和驱动地址空间是隔绝的,不能使用memcpy()函数,必须使用专门的拷贝函数;(2)在拷贝大量数据时使用copy_to_user()和copy_from_user()函数,拷贝单个数据时,比如某个int型变量,则优先使用put_user()和get_user()函数;补充:copy_to_user()和copy_from_user()函数参考博客:《内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)》;2、put_u原创 2022-05-05 23:20:45 · 2123 阅读 · 0 评论 -
字符设备ioctl接口详解
1、为什么要引入ioctl接口?(1)读写操作只是很基础的功能,有的设备需要支持另外的命令去控制;比如串口需要提供设置波特率、数据位、终止位等操作;(2)如果不同的命令操作,都在write和read中去做判断,对于支持命令比较多的设备,那write和read函数就会很大,不利于维护;(3)ioctl函数是专门用来处理上层发给驱动程序的命令,设备有需要就去实现,如果没有需要就不实现这个函数,将函数指针赋值为NULL;2、应用层系统调用#include <sys/ioctl.h>/原创 2022-05-04 17:03:36 · 1903 阅读 · 0 评论 -
一个主设备号是如何支持多个次设备?
1、主次设备号参考博客:《字符设备驱动详解(主次设备号、注册/卸载字符设备驱动、创建设备节点、地址映射)》;2、次设备号介绍(1)在老的驱动程序里是不需要次设备号的,在老版内核中注册驱动用register_chrdev()函数,只需要传入主设备号,次设备号默认是0;(2)后面的驱动注册函数,需要通过alloc_chrdev_region()函数先申请设备号,其中就包括第一个设备号和次设备号的个数;(3)主设备号和次设备号共同表示一个设备驱动;3、使用次设备号的好处(1)共享主设备号的原创 2022-05-04 15:31:21 · 655 阅读 · 0 评论 -
设备节点如何与设备驱动关联
上层应用如何调用设备驱动向内核注册驱动struct inode结构体struct file结构体struct file_operations结构体设备节点和驱动程序关联创建设备节点应用程序打开设备节点应用程序通过设备节点操作设备驱动程序......原创 2022-05-04 14:02:32 · 1015 阅读 · 0 评论 -
字符设备驱动程序自动创建设备节点详解
1、设备节点介绍(1)在linux中一切皆是文件,对上层程序来说设备驱动程序不过就是设备文件,在我们向内核注册好驱动程序后,需要创建对应的设备节点,然后上层应用程序通过读写设备节点的方式去操作硬件;(2)设备节点本质上就是文件,不是普通类型的文件,是字符设备文件、块设备文件、网络设备文件等特殊文件,但是都是用统一的open、read等函数去操作;(3)设备节点在"/dev/"目录下;2、手动创建设备节点(1)在驱动程序注册成功后,可以用mknod命令可以手动创建设备节点;(2)比如:mkn原创 2022-05-04 12:20:01 · 3249 阅读 · 0 评论 -
驱动中重要的三个结构体介绍:struct inode、struct file、struct file_operations
struct inode结构体struct file结构体struct file_operations结构体三者的关联原创 2022-05-03 19:23:27 · 4268 阅读 · 0 评论