
Linux驱动编程
文章平均质量分 54
Donald Linux
日拱一卒无有尽 功不唐捐终入海
展开
-
2023-09-08 I2S通信字节先后的问题 一个16bit的地址 数据先发高位后低位 i2ctransfer -f -y 3 w2@0x10 0x30 0x00 r2
必须都是高位先行的i2ctransfer -f -y 3 w2@0x10 0x30 0x00 r2。原创 2023-09-08 09:59:36 · 415 阅读 · 0 评论 -
2023-09-06 buildroot linux usb otg 口做RNDIS USB模拟以太网、ACM USB虚拟串口usb_rndis_en usb_acm_en .usb_config
有文档说是用/usr/bin/usbdevice restart,但是我测试不行,用./etc/init.d/S50usbdevice restart才可以。2.1 使能ACM后,可以在Device上看到/dev/ttyGS0设备。1.1内核打开配置CONFIG_USB_CONFIGFS_RNDIS。2.5 测试效果,usb otg口可以当普通串口来用。1.4 PC 网络连接会有RNDIS字样。2.4 串口测试程序,收到什么就发送什么。1.2 临时配置(重启后功能消失)2.2 临时配置(重启后功能消失)原创 2023-09-06 15:48:38 · 3296 阅读 · 0 评论 -
2023-09-05 Linux 蓝牙驱动匹配USB 蓝牙的过程简单分析,方法一通过接口描述:USB_INTERFACE_INFO 进行匹配;方法二:通过厂家ID 和device ID匹配。
3.2 方法二:通过厂家ID 和device ID:USB_DEVICE(厂家ID ,device ID) 完成device匹配。bInterfaceSunClass : 子类型代码(由USB组织分配)。3.1 方法一:通过接口描述:USB_INTERFACE_INFO(类,子类,协议) 完成device匹配。主机控制接口(Host Controller Interface) HCI,即主机控制接口,属于。实际测试发现,如果上面两个驱动都打开,有个驱动无法匹配,不能进入probe函数,原因不明。原创 2023-09-05 16:35:17 · 1664 阅读 · 0 评论 -
2023-08-15 linux mipi 屏幕调试:有一个屏幕开机时候不显示,开机后按power 按键休眠唤醒就可以显示。原因是reset gpio 被复用
【代码】2023-08-15 linux mipi 屏幕调试:有一个屏幕开机时候不显示,开机后按power 按键休眠唤醒就可以显示。原因是reset gpio 被复用。原创 2023-08-15 13:59:01 · 1322 阅读 · 0 评论 -
2023-07-27 linux spi 通信 spi_transfer 结构体里面的cs_change,当本次传输完成时候,这个设置影响到数据传输过程中cs的状态。
3.2 情况二:如果某次的传输cs_change 是1的话,表面影响片选,若该次传输不是消息的最后一次传输,则在本次传输结束后会立即将片选设置为无效状态,延时10us再变为有效状态,再进行下一下传输;如果本次传输是最后一次传输,则不会把片选设置为无效,一直保持有效直到下一个消息传输开始。3.1 情况一:所有的传输都是cs_change 是0的话,整个消息处理传数据过程cs都是在有效状态,完成传输后cs才变回无效状态。多次传输组成一个消息,一次消息处理中包含单次或多次的传输。3.4 常用的消息和传输函数。原创 2023-07-27 15:58:49 · 1836 阅读 · 0 评论 -
2023-07-20 linux platform_set_drvdata、platform_get_drvdata和i2c_set_clientdata i2c_get_clientdata 学习
3.4 再来看看platform_get_drvdata 和 platform_set_drvdata 的代码,里面会调用dev_get_drvdata(dev),有时候再驱动里面也可以直接用。4.3 看看 i2c_set_clientdata i2c_get_clientdata 里面 会调用dev_set_drvdata dev_get_drvdata。3.3 看上面会用到to_platform_device ,其实是调用container_of 获取device 指针。原创 2023-07-20 18:04:18 · 1506 阅读 · 0 评论 -
2023-04-19 linux内核态 send_sig_info 向用户态发送信号参数,可以带参数。用户态使用sigaction(SIG_ETX, &new_sa, NULL);处理介绍数据函数
使用for_each_process 遍历所有进程。原创 2023-04-19 17:07:35 · 2363 阅读 · 0 评论 -
2022-11-23 Rockchip i2c切换到另外一个控制口i2c3m2_xfer /I2C3_SCL_M4 方法
4、万用表测试SDA和SLK 电压都是1.25V这样,没有达到高电平,感觉是没有上拉一样,我们的硬件外部也没有上拉。3、但是执行i2cdetect -y 3查看i2c设备的时候会报错。2、按上面的修改后,pin脚功能自动切换。6、可以识别到i2c设备了。1、I2C3挂到M4。原创 2022-11-23 10:36:28 · 1963 阅读 · 0 评论 -
2022-10-28 adb 查看linux设备树节点方法 ,进入/proc/device-tress/ 或者/sys/firmware/devicetree/base 目录查看
一、方法一:进入/sys/firmware/devicetree/base目录查看 二、方法二:进入/proc/device-tress/原创 2022-10-28 14:59:49 · 2982 阅读 · 0 评论 -
2022-08-02 分析RK817 输出32k clock PMIC_32KOUT_WIFI给WiFi模块 clock 注册devm_clk_hw_register
代码】2022-08-02分析RK817输出32kclockPMIC_32KOUT_WIFI给WiFi模块clock注册devm_clk_hw_register。原创 2022-08-02 11:56:18 · 1813 阅读 · 0 评论 -
2022-04-08 将设备树中断标志 interrupt-parent interrupts 映射到devm_request_irq,自动从dts里面获取client->irq 中断号。
一、linux 驱动里面probe有这样一段,自动从dts里面获取client->irq 中断号。在您的probe()函数中,client->irq将包含IRQ编号。二、让我们看一下i2c_device_probe()函数(它probe()是调用驱动程序函数的地方)。static int i2c_device_probe(struct device *dev){ ... if (dev->of_node) { ... ir..原创 2022-04-08 10:13:20 · 3411 阅读 · 1 评论 -
2022-03-22 RK3566 camera MIPI_MCLK输出的学习,MIPI_MCLK_B没有波形,在dts里面添加power-domains就可以。
一、刚刚调试gc5035摄像头,发现MIPI_MCLK_B不输出,然后就分析一下这个问题。二、印象中,dts和软件下面配置就有clk 输出,实际上用示波器测量该pin,没有波形。三、最后在dts里面添加power-domains = <&power RK3568_PD_VI>;就可以,就有波形了。在复杂的片上系统(SOC)中,设计者一般会将系统的供电分为多个独立的block,这称作电源域(Power Domain)。应该是没有打开这个power。四、分析一下...原创 2022-03-22 18:01:57 · 3609 阅读 · 1 评论 -
Linux时钟管理clk devm_clk_get clk_prepare_enable等学习
Linux时钟管理clk 学习一、查看系统clk命令原创 2021-06-05 14:57:46 · 8920 阅读 · 0 评论 -
2021-01-22 Linux:kernel 用writel/readl/ioremap 读写CPU寄存器
Linux:kernel 用writel/readl/ioremap 读写CPU寄存器一、需要添加头文件#include <asm/io.h>二、在uboot中操作CPU寄存器。 reg = readl(PHY_ADDR); reg &= ~IOMUXC_REG_GPR1_ACTCS0_MASK; writel(reg, PHY_ADDR);其中PHY_ADDR是物理地址,跟踪代码发现writel操作如下:#defi...原创 2021-01-22 14:53:01 · 6259 阅读 · 0 评论 -
Android: 使用Linux regulator系统通过一个GPIO控制外部IC的电源
Android: 使用Linux regulator系统通过一个GPIO控制外部IC的电源一、通过一个GPIO控制外部IC的电源,如下图,通过SDMMC0_PWR_H pin(连到CPU的GPIO0_A1)去控制sd卡的电源enable或者disable。二、dts设备树添加如下:三、驱动添加红框里面的代码:三、然后再在驱动里面分别通过regulat......原创 2019-12-05 16:07:44 · 3754 阅读 · 1 评论 -
Linux驱动编程中EXPORT_SYMBOL()介绍
一、查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义。二、那么EXPORT_SYMBOL的作用是什么? EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。三、使用方法原创 2017-11-04 16:43:22 · 51112 阅读 · 9 评论 -
Linux内核同步机制completion学习(DECLARE_COMPLETION wait_for_completion complete)
我这里主要记录我实际测试效果,相关的Linux内核同步机制completion介绍可以参考下面几个帖子:http://blog.youkuaiyun.com/bullbat/article/details/7401688http://blog.youkuaiyun.com/liuxd3000/article/details/17912695http://blog.youkuaiyun.com/davion_zhang原创 2017-11-28 19:27:20 · 1347 阅读 · 0 评论 -
Linux内核事件通知链(Linux Notifier Chains)简介
Linux内核事件通知链(Linux Notifier Chains)简介一、简单介绍 Linux内核中大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之原创 2017-11-05 19:55:38 · 2139 阅读 · 2 评论 -
linux驱动开发延迟函数:msleep、mdelay、udelay介绍
linux 延迟函数:msleep、mdelay、udelay等介绍一、这里介绍一下延时函数msleep、mdelay、udelay等,写驱动的时候偶尔会用到,简单说明他们之间的区别。二、这几个函数在kernel-3.18\include\linux\delay.h定义。三、虽然这些函数都有延迟的作用,他们的区别如下: (1)对于模块本身,mdelay是忙等待函数,在延迟过程中无法运行其他...原创 2018-03-27 17:46:09 · 44253 阅读 · 0 评论 -
linux 驱动中module_platform_driver宏的学习
linux 驱动中module_platform_driver宏的学习一、写linux设备中经常看到有这样一个宏module_platform_driver。如下图一个字符设备驱动程序。今天我们就来学习这个宏的作用。二、这个宏是在kernel/include/linux/platform_device.h里面定义的。我们发现这个里面又调用另外一个宏module_driver。三、那么这个modul...原创 2018-04-05 13:44:11 · 8566 阅读 · 0 评论 -
linux 驱动程序file_operations结构体学习
linux 驱动程序file_operations结构体学习一、file_operations结构体的作用是用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址。里面的成员函数是字符设备驱动程序设计的主体内容,当应用程序进行open()、write()、read()等系统调用时候内核会调用到这些函数。二、file_op...原创 2018-04-06 14:46:59 · 3821 阅读 · 0 评论 -
在Ubuntu上开发编译内核模块以及调试内核模块,并查看printk打印的消息
Ubuntu上开发编译内核模块以及调试内核模块,并查看printk打印的消息 前言:在开发中,为了方便,其实我们是可以先在ubuntu运行和测试内核模块,测试好了再用交叉编译到ARM设备上运行。下面就介绍一下方法和测试代码。1.模块C代码。helloworld.c#include <linux/init.h>#include <linux/mo...原创 2018-09-21 18:31:40 · 3251 阅读 · 0 评论 -
Linux下通过sysfs方式控制GPIO(/sys/class/gpio)
Linux下通过sysfs方式控制GPIO(/sys/class/gpio)一、首先,查看系统中有没有“/sys/class/gpio”这个文件夹,如果没有就在编译内核的时候勾选 Device Drivers-> GPIO Support ->/sys/class/gpio/… (sysfs interface)。二、通过s...原创 2018-12-29 22:42:15 · 19190 阅读 · 5 评论 -
linux驱动 seq_file学习测试实例
linux驱动 seq_file学习测试实例一、从内核中导出信息到用户空间有很多方法,可以自己去实现file_operations的read函数或者mmap函数,但是这种方法不够简单,而且也会有一些限制,比如一次read读取大于1页时,驱动里就不得不去进行复杂的缓冲区管理。为此,就需要学习一下seq_file的用法,为了更简单和方...原创 2019-06-19 18:48:27 · 551 阅读 · 0 评论 -
linux驱动-使用sysfs_create_group创建sysfs接口
linux驱动-使用sysfs_create_group创建sysfs接口1、创建属性文件的sysfs接口:1.1 创建属性文件的sysfs接口函数 ret = sysfs_create_group(&pdev->dev.kobj,&gpio_attr_grp); sysfs_create_group()在kob...原创 2019-07-15 19:17:03 · 6194 阅读 · 1 评论 -
linxu 驱动 DEVICE_ATTR和device_create_file 、 DEVICE_INT_ATTR(version,S_IWUSR | S_IRUGO,version)学习实例
linxu 驱动 DEVICE_ATTR和device_create_file 学习实例简述:linux 驱动中到处可见DEVICE_ATTR和device_create_file,相关的概念我这里就不说了,网上很多。下面就是我自己学习和测试的实例。在Android上测试,测试driver代码:#include #include /*驱动注册的头文原创 2017-11-11 19:17:36 · 4405 阅读 · 0 评论