![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
linux驱动基础学习
本栏主要涉及linux驱动学习基本,芯片采用三星S5P6818,开发板采用X6818,Linux Kernel 3.4.x,
参考资料:三星S5P6818芯片手册、.开发板配套的外围设备芯片手册、《Unix 设备驱动程序》第三版、《Linux内核设计与实现》第三版
weixin_47273317
本人2012年至2020年2月从事弱电方面工作,2020年2月离职后开始学习linux软件开发方面的知识。
展开
-
嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式二
嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式二一、代码举例二、用户空间程序(参考方式一)本实例是通过i2c_new_device函数添加I2C设备,相比于板级添加,减少了去源码中查看启动函数的麻烦一、代码举例#include <linux/init.h>#include <linux/module.h>#include <linux/i2c.h>#include <linux/fs.h>#include &原创 2020-09-08 10:07:07 · 314 阅读 · 0 评论 -
嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式一
嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)一、软件驱动代码二、用户空间代码举例一、软件驱动代码功能:读取mma8653的x,y,z轴数值,并传递给用户空间#include <linux/init.h>#include <linux/module.h>#include <linux/i2c.h>#include <linux/fs.h>#include <linux/miscdevice.h>#i原创 2020-09-06 13:08:22 · 412 阅读 · 0 评论 -
嵌入式LINUX驱动学习之15 i2c总线源码分析
嵌入式LINUX驱动学习之15 i2c总线源码分析(一)一、i2c设备的注册1.1、struct i2c_board_info结构体及头文件1.2、i2c_register_board_info()函数头文件1.2.1、i2c_register_board_info()函数实现二、i2c驱动软件信息3.1结构体及函数一、i2c设备的注册1.1、struct i2c_board_info结构体及头文件//头文件位置 : include/linux/i2c.h //结构体定义struct i2c_bo原创 2020-09-05 18:14:56 · 503 阅读 · 0 评论 -
嵌入式LINUX驱动学习之14软硬件分离编程(四)代码举例(通过测试程序操作LED灯 ioctl、set_bit/clear_bit)
嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过测试程序操作LED灯 ioctl、set_bit/clear_bit)一、硬件信息驱动程序二、代码举例(软件驱动)三、测试程序(用户空间)一、硬件信息驱动程序同 《嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过struce device 成员void *platform_data 实现)》 ->一、代码举例(定义硬件信息)二、代码举例(软件驱动)功能:用户空间程序打字符设备文件后,可以通过ioctl文件打原创 2020-09-01 12:59:47 · 244 阅读 · 0 评论 -
嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过struce device 成员void *platform_data 实现)
嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例(通过struce device 成员void *platform_data 实现)一、代码举例(定义硬件信息)二、代码举例(软件驱动)一、代码举例(定义硬件信息)#include <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>/*定义结构体对象,用于保存LED灯硬件信息 phy_addr :用原创 2020-08-30 19:14:37 · 127 阅读 · 0 评论 -
嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例(通过struct resource结构体方式实现)
嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例一、硬件信息配置二 、软件驱动代码:一、硬件信息配置//btn_led_dev.cinclude <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>struct resource led_src_B[] = { { //用于保存寄存器地址 .start = 0XC001B000,原创 2020-08-29 18:35:33 · 151 阅读 · 0 评论 -
嵌入式LINUX驱动学习之14软硬件分离编程(一)源码部分
嵌入式LINUX驱动学习之12软硬件分离编程一、描述硬件信息头文件、函数及说明二、描述软件信息头文件、函数及说明一、描述硬件信息头文件、函数及说明//头文件位置:linux/platform_device.h/* struct platform_device{}结构体 功能:保存驱动的硬件信息*/struct platform_device { /* name 和id配合使用; 当id = -1时,注册到kobject列原创 2020-08-29 16:01:37 · 148 阅读 · 0 评论 -
嵌入式LINUX驱动学习之13内核数据结构(链表)
嵌入式LINUX驱动学习之13内核数据结构(链表)一、头文件、函数及说明一、头文件、函数及说明/* 1、初始化链表函数 :INIT_LIST_HEAD()*/ static inline void INIT_LIST_HEAD(struct list_head *list){ list->next = list; list->prev = list;}/* 2、向链表添加节点函数:list_add() 参数说原创 2020-08-29 13:29:15 · 102 阅读 · 0 评论 -
嵌入式LINUX驱动学习之12内核内存分配
嵌入式LINUX驱动学习之12内核内存分配一、头文件、函数及说明:一、头文件、函数及说明://头文件位置 : include/linux/slab.h/*申请内存函数: kmalloc() 实现方式一般参考源文件:include/linux/slab_def.h 、 include/linux/slob_def.h、 include/linux/slub_def.h 功能:分配一段物原创 2020-08-28 18:17:17 · 94 阅读 · 0 评论 -
嵌入式LINUX驱动学习之11 物理地址-用户空间虚拟地址映射mmap()
嵌入式LINUX驱动学习之10 物理地址-用户空间虚拟地址映射mmap()一、头文件、函数及说明一、头文件、函数及说明//头文件位置:include/linux/mm.hint remap_pfn_range(struct vm_area_struct *, unsigned long addr,\ unsigned long pfn, unsigned long size, pgprot_t);...原创 2020-08-22 13:44:25 · 223 阅读 · 0 评论 -
嵌入式LINUX驱动学习之10 物理地址-内核虚拟地址映射 ioremap()/iounmap()
@[TOC](嵌入式LINUX驱动学习之10物理地址-内核虚拟地址映射 ioremap()/iounmap())一、头文件、函数及说明//源码位置:arch/arm/include/asm/io.h #define MT_DEVICE 0#define MT_DEVICE_NONSHARED 1#define MT_DEVICE_CACHED 2#define MT_DEVICE_WC #define ioremap(cookie,size)原创 2020-08-21 17:58:49 · 402 阅读 · 0 评论 -
嵌入式LINUX驱动学习之9等待队列
嵌入式LINUX驱动学习之9等待队列一、头文件、函数及说明一、头文件、函数及说明/* wait_queue_head_t 结构体 源码位置:include/linux/wait.h*/struct __wait_queue_head { spinlock_t lock; struct list_head task_list;};typedef struct __wait_queue_head wait_queue_head_t;/* 初原创 2020-08-19 19:37:51 · 106 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(六)整型原子操作
嵌入式LINUX驱动学习之8竞态和并发相关问题(六)整型原子操作一、头文件、函数及说明附 A1.1一、头文件、函数及说明/* 结构体 atomic_t头文件位置:include/linux/types.h*/typedef struct { int counter;} atomic_t;/* 整型原子操作函数 : atomic_add_return()、atomic_sub_return() atomic_add()、atomic_原创 2020-08-18 19:55:24 · 129 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题 (五)位原子操作
嵌入式LINUX驱动学习之8竞态和并发相关问题 (五)位原子操作一、位原子操作相关头文件函数及说明二、位原子操作用法附A.1附 A.1.1附A.1.2原子操作分为位原子操作的整形原子操作,即每次操作1位或1个整型;位原子操作,建议最大修改的数据位为:BITS_PER_LONG -1,当大于或等于BITS_PER_LONG可能出现吐核心情况一、位原子操作相关头文件函数及说明/* 位操作函数: set_bit()、clear_bit()、change_bit() 源码位置:include/asm-原创 2020-08-18 18:45:13 · 190 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(四)信号量
嵌入式LINUX驱动学习之8竞态和并发相关问题(四)信号量一、头文件、函数及说明附A.1附1.2信号量运行在进程中,可以因超时或中断信号而结束,可以进行休眠操作一、头文件、函数及说明//源码位置:include/linux/semaphore.h//结构体对象:struct semaphore {}struct semaphore { raw_spinlock_t lock; unsigned int count;原创 2020-08-17 19:57:25 · 75 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(三)衍生自旋锁
嵌入式LINUX驱动学习之8竞态和并发相关问题(三)衍生自旋锁一、头文件、函数及说明附A.1附A.1.1一、头文件、函数及说明衍生自旋锁主要是基于自旋锁和中断屏蔽实现,对于使用衍生自旋锁的内容不能进行休眠操作/* 对要操作的全局变量或寄存器添加衍生自旋锁函数: spin_lock_irqsave(lock,flags); 参数: lock : spinlock_t lock; flags: unsigned long flags);原创 2020-08-17 17:33:10 · 86 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(二)自旋锁
嵌入式LINUX驱动学习之8竞态和并发相关问题(二)自旋锁一、头文件、函数及说明附A 1.1附A 1.1.1一、头文件、函数及说明/* spinlock_t源码位置 : include/linux/spinlock_types.h*/ typedef struct spinlock { union { struct raw_spinlock rlock;//实现见附A 1.1#ifdef CONFIG_DEBUG_LOCK_ALLOC# def原创 2020-08-16 17:17:53 · 75 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(一)中断屏蔽
嵌入式LINUX驱动学习之8竞态和并发相关问题(一)中断屏蔽一、中断屏蔽的方法头文件及说明二、代码举例(内核空间)三、代码举例(用户空间)四、测试一、中断屏蔽的方法头文件及说明//源码位置:include/linux/irqflags.h#define local_irq_save(flags) \ do { \原创 2020-08-14 20:08:39 · 83 阅读 · 0 评论 -
嵌入式LINUX驱动学习之8竞态和并发相关问题(零)基础理论
嵌入式LINUX驱动学习之8竞态和并发相关问题(零)基础理论一、什么是并发和竞态?二、什么是互斥访问三、互斥访问的方法:3.1 中断屏蔽3.1.1 中断屏蔽的特点:3.1.2 中断屏蔽的互斥访问过程:3.1.3 使用中断屏蔽可能带来的问题和需要注意的事项3.2 自旋锁3.2.1 自旋锁的特点:3.2.1 衍生自旋锁的特点3.3 信号量3.3.1 信号量特点:3.4 原子操作3.4.1 原子操作特点:一、什么是并发和竞态?并发: 多个执行单元同时发生;执行单元是指:进程和中断;竞态:多个执行单元对原创 2020-08-13 19:11:41 · 116 阅读 · 0 评论 -
嵌入式LINUX驱动学习之7中断相关(五)延迟处理函数
嵌入式LINUX驱动学习之7中断相关(五)延迟处理函数一、忙延迟方法头文件及说明(主要用于中断处理函数内)二、休眠延迟方法头文件、函数及说明(进程中使用)linux系统中,任务的延迟分为两种:一种:是忙延迟,主要用在中断相关的函数中,实现的方式为原地空转,类似于while(n),这种方式不会释放资源,而是一直处理等待状态;另一种:是休眠延迟,这种方式主要用于进程,一但使用休眠延迟,进程将释放资源,待延迟时间结束后重新获取资源,继续运行一、忙延迟方法头文件及说明(主要用于中断处理函数内)//源码位置原创 2020-08-13 17:39:59 · 262 阅读 · 0 评论 -
嵌入式LINUX驱动学习之7中断相关(四)软件定时器
嵌入式LINUX驱动学习之7中断相关(四)定时器一、头文件、函数及说明二、代码举例说明:linux定时器是基于软中断实现的,不能进行休眠操作一、头文件、函数及说明//源码位置:include/linux/timer.hstruct timer_list { //.............省略更多,由内核维护或一般不用关心的结构体成员................... unsigned long expires; //给定时器设定的时间 void (*function)(u原创 2020-08-13 12:31:15 · 109 阅读 · 0 评论 -
嵌入式LINUX驱动学习之7中断相关(三)底半部机制之work_struct
嵌入式LINUX驱动学习之7中断相关(二)底半部机制之work_struct一、头文件、函数及说明work_struct工作在进程上下文,允许进行休眠操作一、头文件、函数及说明struct work_struct { atomic_long_t data; struct list_head entry; // 内核维护的工作队列列表 work_func_t func; //延迟处理函数 #ifdef CONFIG_LOCKDEP st原创 2020-08-12 12:16:43 · 146 阅读 · 0 评论 -
嵌入式LINUX驱动学习之7中断相关(二)底半部机制之tasklet_struct
嵌入式LINUX驱动学习之7中断相关(二)底半部机制之tasklet_struct一、头文件、函数及说明二、代码举例一、头文件、函数及说明//源码位置:include/linux/interrupt.hstruct tasklet_struct{ struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long);原创 2020-08-11 18:11:20 · 206 阅读 · 0 评论 -
嵌入式LINUX驱动学习之7中断相关(一)中断处理函数
嵌入式LINUX驱动学习之7中断相关(一)中断处理函数一、函数、头文件及说明二、编译举例:一、函数、头文件及说明//头文件位置:include/linux/interrupt.hextern int __must_checkrequest_threaded_irq(unsigned int irq, irq_handler_t handler,\ irq_handler_t thread_fn,\ unsigned原创 2020-08-10 13:19:03 · 333 阅读 · 0 评论 -
嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用
嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用 一、头文件位置及主要结构体主要成员变量说明二、内核代码举例:三、用户空间代码实现:四、测试嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用 )混杂设备主设备号为10,一般只需要分配次设备号,可以自己指定(如果重复会报错),也可以交给内核分配使用混杂设备方式编程,混杂设备注册时,自动创建了字符设备,不需要执行mknod命令,具体实现方式见misc_register函数一、头文件位置及主要结构体主要成员变量说明头文件位置:i原创 2020-08-08 20:00:58 · 156 阅读 · 0 评论 -
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(三)用户空间实现代码
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(三)用户空间实现代码include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#define LED_ON 0X100#define LED_OFF 0X101#defi原创 2020-08-06 20:07:53 · 97 阅读 · 0 评论 -
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(二)内核空间实现代码
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(二)内核空间实现代码#include <linux/init.h>#include <linux/module.h>#include <linux/gpio.h>#include <mach/platform.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/uaccess.h>原创 2020-08-06 20:05:31 · 108 阅读 · 0 评论 -
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(一)函数说明
嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(一)一 、内核空间使用的对应函数unlocked_ioct()1.1函数头文件及原型1.2 初始化unlocked_ioctl()函数操作接口二、用户空间的编程函数:ioctl(2)说明:一般的字符设备可以使用ioctl函数替代write()和read()函数一 、内核空间使用的对应函数unlocked_ioct()1.1函数头文件及原型//头文件位置:include/linux/fs.hstruct file_operations {原创 2020-08-06 20:01:20 · 154 阅读 · 0 评论 -
嵌入式LINUX驱动学习之4.字符设备驱动编程(四)用户空间实现代码之驱动测试
嵌入式LINUX驱动学习之4.字符设备驱动编程(四)用户空间实现代码之驱动测试//编译好之后在下位机执行#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>/* 打印LED灯现在的运行状态(开灯|关灯)*/void print_led_state(int fd){ int ubuf[原创 2020-08-05 19:38:31 · 109 阅读 · 0 评论 -
嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载
嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载一、注册驱动 模块:二、查看注册的主设备号三、根据主设备号创建字符设备文件3.1方式一:通过bash创建方式二:通过C语言编写代码创建,代码见附A,以编译好的文件名为:mychrdev_reg为例:四卸载驱动模块附A说明:本例以生成的驱动模块为文件mychrdev.ko为例 ,所有执行都在下位机一、注册驱动 模块:insmod mychrdev.ko二、查看注册的主设备号cat /proc/devices原创 2020-08-05 19:37:22 · 134 阅读 · 0 评论 -
嵌入式LINUX驱动学习之4.字符设备驱动编程(二)内核驱动实现代码
@TOC内核驱动实现代码 )#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <asm/gpio.h>#include <mach/platform.h>#include <linux/uaccess.h>static dev_t file_dev_num;/原创 2020-08-05 18:50:45 · 157 阅读 · 0 评论 -
linux驱动学习之alloc_chrdev_region源码分析(二):__register_chrdev_region
linux驱动学习之alloc_chrdev_region源码分析:__register_chrdev_region/*major : 主设备号baseminor : 次设备号minorct : 次设备号数目name : 名称(标签)*/static struct char_device_struct *__register_chrdev_region(unsigned int major, unsigned int baseminor,原创 2020-08-04 20:07:25 · 674 阅读 · 0 评论 -
linux驱动学习之alloc_chrdev_region源码分析(一)
linux驱动学习之alloc_chrdev_region源码分析(一)linux驱动学习之alloc_chrdev_region源码分析(一))函数实现:fs/char_dev.c/*形参一 dev:主设备号,一般定义为全局静态变量形参二:baseminor:次设备号,一般从0开始形参三:count:次设备号个数,根据需要填写形参四:name : 名字(标签),最大64个字节*/int alloc_chrdev_region(dev_t *dev, unsigned baseminor,原创 2020-08-04 20:05:21 · 866 阅读 · 0 评论 -
嵌入式LINUX驱动学习之4.字符设备驱动编程(一)
嵌入式LINUX驱动学习之4.字符设备驱动编程(一)一、字符设备操作接口数据结构:truct file_operations1.1 头文件1.1.1THIS_MODULE宏实现1.2 struct file_operations结构体使用1.2.1用户空间和内核之间进行数据传输的函数:copy_to_user() 、 copy_from_user()二、定义初始化字符设备对象2.1头文件2.2函数实现(了解即可)三、向内核添加注册字符设备对象:cdev_add()1.4.1 头文件1.4.2 函数实现四、向原创 2020-08-02 19:49:43 · 118 阅读 · 0 评论 -
嵌入式LINUX驱动学习之3.字符设备(设备号申请)
嵌入式LINUX驱动学习之3.字符设备(设备号申请)一、设备号申请函数:alloc_chrdrv_region()1.1 函数头文件1.2 函数功能:1.3 函数参数:1.4 关键宏函数使用二、释放设备号函数2.1 函数头文件1.2 函数功能:1.3 函数参数:三、举例:一、设备号申请函数:alloc_chrdrv_region()1.1 函数头文件//头文件位置:include/linux/fs.h//函数实现:fs/char_dev.c#include <linux/fs.h>i原创 2020-08-02 13:53:14 · 155 阅读 · 0 评论 -
嵌入式LINUX驱动学习之1.linux 内核打印函数printk
1.linux 内核打印函数printk一、函数有头文件二、定义的关键宏三、函数原型合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入一、函数有头文件 路径:/opt/kernel/include/linux/printk.h 头文件原创 2020-08-01 02:08:00 · 1258 阅读 · 0 评论