
linux驱动
文章平均质量分 89
Mark wyz
A person who is willing to be successful
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Regulator 框架(二):Regulators 消费者接口
转载来源于:https://www.cnblogs.com/wanglouxiaozi/p/15091263.html消费者接口只要求驱动程序包含一个头文件:#include <linux/regulator/consumer.h>消费者可以是静态的,也可以是动态的。静态调节器只需要一个固定的电源,而动态调节器需要在运行时对调节器进行主动管理。从消费者的角度来看,调节器设备在内核中被表示为一个struct regulator 结构的实例,在drivers/regulator/interna转载 2022-05-22 09:24:51 · 2151 阅读 · 0 评论 -
Regulator 框架(一): PMIC /生产者 驱动接口
转载来源:https://www.cnblogs.com/wanglouxiaozi/p/15089298.html调节器(regulator)是一种为其他设备供电的电子设备。由调节器供电的设备被称为消费者。它们消耗调节器提供的电力。大多数调节器可以启用和禁用他们的输出,一些也可以控制他们的输出电压或电流。驱动程序应该通过特定的函数和数据结构向消费者公开这些功能,这些在稍后讨论。提供物理调节的芯片被称为电源管理集成电路(PMIC):Linux调节器框架被设计用于接口和控制电压和电流调节器。分为四个单独转载 2022-05-22 09:21:13 · 2637 阅读 · 0 评论 -
内核链表详解 (struct list_head)
1.自己实现内核链表的部分2.内核链表使用举例#include <stdio.h>struct list_head{ struct list_head * prev; struct list_head * next;};#define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \struct list_head name = LIST_HEAD_INIT(name)原创 2020-10-13 09:46:33 · 2227 阅读 · 0 评论 -
海思I2C总线操作
海思I2C总线操作1.使用I2C命令:i2c_write <i2c_num> <device_addr> <reg_addr> <value> <reg_width> <data_width>i2c_read <i2c_num> <device_addr> <reg_addr> <end_reg_addr><reg_width> <data_width> &原创 2020-06-20 14:37:08 · 3879 阅读 · 0 评论 -
海思GPIO和中断操作
中断部分:1.关于gpio的操作<1>gpio_request(gpio_num, NULL); 注册 GPIO<2>设置gpio方向:对于输入: gpio_direction_input(gpio_num) 对于输出: gpio_direction_output(gpio_num, gpio_out_val)<3>查看 GPIO 输入值或设置 GPIO 输出值gpio_get_value 查看输入值输出低: gpio_set_value(gpio_n原创 2020-06-20 11:09:07 · 3148 阅读 · 1 评论 -
poll函数深入理解
1.看poll函数的调用逻辑poll 应用的poll函数 sys_poll do_sys_poll /*初始化一个poll_wqueues变量table*/ poll_initwait(&table); __pollwait 将在驱动的poll函数里的poll_wait函数用到 table ->pt-> qproc=__pollwait; do_poll(nfds, head, &table, timeout); for (;原创 2020-06-18 20:09:17 · 1404 阅读 · 0 评论 -
S5PV210按键添加timer去抖动
代码如下:#include <linux/input.h>#include <linux/module.h>#include <linux/init.h>#include <asm/irq.h>#include <asm/io.h>#include <linux/gpio.h>#include <linux...原创 2019-08-10 18:12:19 · 222 阅读 · 0 评论 -
一个简单的LED驱动-不基于驱动框架
驱动:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/ioport.h>#include <asm/uaccess.h>#include &l...原创 2019-08-13 22:30:20 · 170 阅读 · 0 评论 -
中断方式实现按键驱动
1.参考:input-programing.txt文件,里面有式例。从里面copy一个大概的模板出来。2.我们板子所有的中断资源都在:arch/arm/mach-s5pv210/include/irqs.h,我们inlucde <asm/irq.h>就可以了,因为后面的头文件有包含前面的头文件。3.request_irqtypedef irqreturn_t (*irq_hand...原创 2019-07-28 20:50:46 · 791 阅读 · 0 评论 -
input子系统
1.何为输入设备Linux 系统下把键盘、鼠标、触摸屏、游戏句柄等等设备都当做是输入设备2.linux中输入设备的编程模型struct input_event3.input子系统简介input子系统分4个部分:应用层 + input event + input core + 硬件驱动input设备应用层编程实践1.应用层操作驱动有2条路:/dev目录下的设备文件,/sys目录下...原创 2019-07-28 15:48:04 · 406 阅读 · 0 评论 -
触摸屏驱动
触摸屏相关知识1.常用的2种触摸屏:电阻触摸屏和电容触摸屏2.电阻触摸屏。驱动一般分2种:一种是SoC内置触摸屏控制器,一种是外置的专门触摸屏控制芯片,通过I2C接口和SoC通信。3.电容触摸屏。驱动只有一种,外接专用的电容式触摸屏控制芯片,I2C接口和SoC通信4.X210V3S使用的触摸屏:gslX6805.学习触摸屏驱动的关键点(1)input子系统相关知识(2)中断上下半部...原创 2019-08-10 18:13:56 · 901 阅读 · 0 评论 -
framebuffer驱动分析
framebuffer驱动框架:先看一张图:图片来源于网络驱动框架部分:1.drivers/video/fbmem.c。主要任务:1、创建graphics类、注册FB的字符设备驱动、提供register_framebuffer接口给具体framebuffer驱动编写着来注册fb设备的。本文件相对于fb来说,地位和作用和misc.c文件相对于杂散类设备来说一样的,结构和分析方法也是类似的。...原创 2019-07-27 15:14:49 · 395 阅读 · 0 评论 -
内存查看工具源码
/*devmem2.c: Simple program to read/write from/to any location in memory.Copyright © 2000, Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)This software has been developed for the LART computing boa...原创 2019-08-13 22:34:01 · 399 阅读 · 0 评论 -
S5PV210按键POLL实现机制
驱动程序:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/ioport.h>#include <linux/interrupt.h>#incl...原创 2019-08-19 20:11:22 · 238 阅读 · 0 评论 -
异步通知
实现:1.让驱动有数据时,去主动告诉应用程序,让应用程序读。驱动:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/ioport.h>#include ...原创 2019-08-19 21:41:40 · 337 阅读 · 0 评论 -
S5PV210按键驱动-不基于驱动input系统
驱动代码:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/ioport.h>#include <linux/interrupt.h>#incl...原创 2019-08-14 23:23:32 · 205 阅读 · 0 评论 -
S5PV210 buzzer驱动
我们buzzer的驱动,我们是基于杂项类设备驱动杂项类设备驱动框架:misc.c文件,里面做了这些事:1.class_create(THIS_MODULE, “misc”); 在/sys/class 下面创建了misc类2.register_chrdev(MISC_MAJOR,“misc”,&misc_fops) 注册字符设备驱动,主设备号是103.提供杂项类设备的注册/注销方法...原创 2019-10-06 22:14:14 · 525 阅读 · 0 评论 -
S5PV210 I2C电容触摸屏驱动
S5PV210 I2C电容触摸屏:1.gslX680(上海思立微电子科技有限公司-多点电容触控 IC)2.有4根线引出,SCL、SDA、IRQ、SHUTDOWNSCL:I2C时钟线SDA:I2C数据线IRQ:中断线,有数据包的时候,gslX680拉高IRQ,提示主机有新的数据包到来SHUTDOWN:睡眠线,GSL1680 SHUTDOWN 引脚拉低时,会进入睡眠模式3.地址前7位为...原创 2019-10-08 20:11:26 · 1133 阅读 · 0 评论 -
第一个驱动模块 __init __exit printk函数分析
第一个驱动模块 __init __exit printk函数分析代码:#include <linux/module.h> #include <linux/init.h>// 模块安装函数static int __init chrdev_init(void){ printk(KERN_INFO “chrdev_init helloworld init\n”)...原创 2019-07-09 21:24:30 · 288 阅读 · 0 评论 -
platform平台总线编写LED驱动
1.使用之前LED驱动框架的代码为基础来改写。先改写driver部分,也就是leds-x210.c部分。添加platform_driver:static int s5pv210_led_probe(struct platform_device *dev){printk(KERN_INFO, “s5pv210_led_probe\n”);return 0;}static int s5...原创 2019-07-21 16:33:02 · 454 阅读 · 0 评论 -
platform平台总线工作原理
何为平台总线?(1)相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的。(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。平台总线下管理的2员大将1.platform工作体系都定义在drivers/base/platform.c中2.两个结构体:platform_devi...原创 2019-07-21 14:24:21 · 538 阅读 · 0 评论 -
驱动模板之最简单
代码:#include <linux/init.h>#include <linux/module.h>static int __init s5pv210_led_init(void){return 0;}static void __exit s5pv210_led_exit(void){}module_init(s5pv210_led_init);m...原创 2019-07-18 22:33:19 · 370 阅读 · 0 评论 -
驱动中如何控制硬件之点亮LED
我们先思考一下,我们在驱动中去操作硬件,哪些地方没变?1.硬件的物理原理没变2.硬件的操作接口寄存器没变3.硬件的操作代码不变那么哪些地方变了呢?1.寄存器地址不同。原来是直接用物理地址,现在需要用该物理地址在内核虚拟地址空间相对应的虚拟地址。寄存器的物理地址是CPU设计时决定的,从datasheet中查找到的2.编程方法不同。裸机中习惯直接用指针操作寄存器地址,而kernel中习惯用...原创 2019-07-11 20:56:44 · 527 阅读 · 0 评论 -
静态映射表建立过程分析
建立映射表的三个关键部分1.映射表具体物理地址和虚拟地址的值相关的宏定义:位于arch/arm/plat-s5p/cpu.c文件中s5p_iodesc结构体数组static struct map_desc s5p_iodesc[] __initdata = {{.virtual = (unsigned long)S5P_VA_CHIPID,.pfn = __phys_to_pfn(S...原创 2019-07-15 23:31:54 · 493 阅读 · 0 评论 -
字符设备驱动的工作原理:
系统整体工作原理1.应用层->API->设备驱动->硬件2.API:open、read、write、close等3.驱动源码中提供真正的open、read、write、close等函数实体应用层的open、read、write、close等最终也是调用到驱动层的。下面我们看一下file_operations结构体,它在linux/fs.h下面/*NOTE:re...原创 2019-07-10 21:36:00 · 751 阅读 · 0 评论 -
自动创建设备文件
能否自动生成和删除设备文件?不使用mknod?解决方案:udev(嵌入式中用的是mdev)(1)什么是udev?应用层的一个应用程序(2)内核驱动和应用层udev之间有一套信息传输机制(netlink协议)(3)应用层启用udev,内核驱动中使用相应接口(4)驱动注册和注销时信息会被传给udev,由udev在应用层进行设备文件的创建和删除。具体步骤:内核驱动设备类相关函数:cla...原创 2019-07-13 16:22:56 · 373 阅读 · 0 评论 -
新的接口来注册字符设备
老接口:register_chrdev新接口:register_chrdev_region / alloc_chrdev_region + cdevcdev结构体:struct cdev {struct kobject kobj;struct module *owner; //一般初始化为:THIS_MODULEconst struct file_operations *ops;...原创 2019-07-13 15:26:31 · 200 阅读 · 0 评论 -
make modules 和 make modules_install depend
make modules 和 make modules_install depend:make modules:把指定为M的硬件驱动,进行编译modules_install INSTALL_MOD_PATH=/media/wyz/rootfs,把指定为M的驱动安装到/media/wyz/rootfs下面的/lib/modules目录下面,/media/wyz/rootfs指的是文件系统根...原创 2019-07-03 15:41:51 · 4723 阅读 · 0 评论 -
第一个linux驱动模块分析:
我们先看一下代码:#include <linux/module.h> #include <linux/init.h>// 模块安装函数static int __init chrdev_init(void){ printk(KERN_INFO “chrdev_init helloworld init\n”);return 0;}// 模块卸载函数stat...原创 2019-07-08 21:35:18 · 514 阅读 · 0 评论 -
misc类设备与蜂鸣器驱动
1.九鼎提供的在x210-buzzer.c中,但是没有默认集成到内核中,make menuconfig选中,九鼎提供的Makefile 和 Kconfig不符合,有bug,Kconfig中的是X210_BUZZER_DRIVER, Makefile中的是CONFIG_BUZZER_DRIVER,修改Makefile为CONFIG_X210_BUZZER_DRIVER。2.注意Kconfig和M...原创 2019-07-23 20:51:32 · 386 阅读 · 0 评论 -
驱动之模块内的函数
1.一般模块内的函数都是用static修饰的,只能在本文件内可以使用2.那么要给别的文件用,怎么办呢?那就使用下面两种方法之一来导出函数:int misc_register(struct miscdevice * misc){xxx;}EXPORT_SYMBOL(misc_register)//所有的模块都可以使用或者EXPORT_SYMBOL_GPL(misc_register...原创 2019-07-23 22:14:34 · 189 阅读 · 0 评论 -
linux设备驱动模型
1.什么是设备驱动模型?(1)类class、总线bus、设备device、驱动driver(2)kobject和对象生命周期(3)sysfs(4)udev2.为什么需要设备驱动模型?(1)早期内核(2.4之前)没有统一的设备驱动模型,但照样可以用(2)2.6版本中正式引入设备驱动模型,目的是在设备越来越多,功耗要求等新特性要求的情况下让驱动体系更易用、更优秀。(3)设备驱动模型负责...原创 2019-07-21 13:03:58 · 154 阅读 · 0 评论 -
offsetof宏和container_of宏
见代码原型:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#define container_of(ptr, type, member) ({ const typeof(((type *)0)->member) * __mptr = (ptr); (type *)((char *)__mp...原创 2019-07-21 10:32:23 · 142 阅读 · 0 评论 -
将驱动添加到内核中
1.驱动的存在形式野生,优势是方便调试开发,所以在开发阶段都是这种家养,优势可以在内核配置时make menuconfig决定内核怎么编译,方便集成2.驱动开发的一般步骤以模块的形式在外部编写、调试将调试好的驱动代码集成到kernel中将驱动添加到内核中步骤1:找到我们写的.c文件该放到哪个目录,我们写的leds-x210.c是根据驱动框架写的,所以应该放到kernel/driver...原创 2019-07-20 17:02:28 · 586 阅读 · 0 评论 -
linux的gpiolib的使用
使用gpiolib完成led驱动,代码如下:#include <linux/init.h>#include <linux/module.h>#include <linux/leds.h>#include <linux/io.h>#include <mach/regs-gpio.h>#include <mach/gpio-...原创 2019-07-20 16:33:35 · 846 阅读 · 0 评论 -
framebuffer之应用层代码
1.什么是framebuffer?framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备,从驱动来看,fb是一个典型的字符设备,而且创建了一个类/sys/class/graphics。2.framebuffer的使用设备文件 /dev/fb0到fb4,主设备号都是29,次设备号从0-4,获取设备信息要使用这个...原创 2019-07-24 22:35:44 · 407 阅读 · 0 评论 -
linux内核的gpiolib
gpiolib引入(1)一个事实:很多硬件都要用到GPIO、GPIO会复用(2)如果同一个GPIO被2个驱动同时控制了,就会出现bug(3)内核提供gpiolib来统一管理系统中所有GPIO(4)gpiolib本身属于驱动框架的一部分gpiolib学习重点(1)gpiolib的建立过程(2)gpiolib的使用方法:申请、使用、释放(3)gpiolib的架构:涉及哪些目录的哪些文...原创 2019-07-20 15:19:05 · 328 阅读 · 0 评论 -
根据LED驱动框架写的3颗LED的驱动代码完整版
代码:#include <linux/init.h>#include <linux/module.h>#include <linux/leds.h>#include <linux/io.h>#include <mach/regs-gpio.h>#include <mach/gpio-bank.h>#define ...原创 2019-07-19 21:35:04 · 653 阅读 · 0 评论 -
根据LED驱动框架来写LED驱动
何谓驱动框架?先明白:驱动是谁写的?(1)驱动开发工程师(2)内核维护者驱动编程协作要求?(1)接口标准化(2)尽量降低驱动开发者难度那么什么是驱动框架呢?(1)内核中驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架。(1)内核中驱动部...原创 2019-07-19 21:32:35 · 293 阅读 · 0 评论 -
linux上查看系统的物理/虚拟地址的数据
linux上查看系统的物理/虚拟地址的数据:查看物理地址:首先下载:apt-get install devmem2使用: devmem2 命令例如: devmem2 0x40402000 可以查看系统上面的实际的物理地址0x40402000的数据:32bit = 4byte打印如下:/dev/mem opened.Memory mapped at address 0xb6f67000...原创 2019-06-27 16:09:20 · 6169 阅读 · 0 评论