驱动开发
文章平均质量分 76
六个九十度
嵌入式软件工程师
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux下通过sysfs读写GPIO的一个注意事项
要加上系统给所选gpio控制器分配的base编号!原创 2025-11-15 18:35:11 · 427 阅读 · 0 评论 -
一种让PetaLinux 2020.2从QSPI flash启动的简单办法
先找到手动启动linux的uboot命令序列,再将其填写到boot.scr,并放置到eMMC的FAT分区原创 2025-09-13 16:11:59 · 1244 阅读 · 0 评论 -
将Linux代码从用户态挪到内核的一种简便方法
如果只是想把一部分代码从用户态挪到内核态,不需要编写驱动,只需要编写一个自定义misc设备,然后在内核模块入口里注册即可。原创 2025-07-24 19:00:58 · 297 阅读 · 0 评论 -
zynq-7000平台uboot莫名进入命令行模式
RX引脚要做上拉原创 2025-05-22 11:24:45 · 419 阅读 · 0 评论 -
fatal error: stdarg.h: No such file or directory错误的一种冷门原因
gcc版本过高或过低,需要安装匹配版本,并通过CC环境变量告知make原创 2025-02-13 10:30:06 · 851 阅读 · 0 评论 -
将RK3588平台的TMC等USB function驱动挪出内核源码树
先加载ko,再在configfs里执行mkdir func、ln -s func config/、echo gadget > UDC三步骤原创 2024-09-04 15:01:37 · 780 阅读 · 0 评论 -
基于USB host控制器实现的TMC驱动
跨性别的USB-TMC原创 2024-08-09 17:44:07 · 1898 阅读 · 2 评论 -
支持高带宽数据采集卡的XDMA优化之路
XDMA存在非常多的优化点,希望这些优化措施能帮到你原创 2024-08-20 19:25:52 · 3368 阅读 · 7 评论 -
基于GT911触控IC的电容屏在MSP430上的驱动
GT911的COOR_ADDR寄存器只要读了,就一定要写0清零,切记。原创 2024-03-16 11:45:35 · 1875 阅读 · 0 评论 -
STM32作为SPI slave与主机异步通信
slave开机后处于SPI接收主机command状态,收到用户输入后abort当前的接收,进入SPI发送状态,发送完毕后,恢复接收command状态。原创 2024-03-02 16:57:20 · 2406 阅读 · 0 评论 -
TI的电量计驱动在卸载时导致Linux卡死
TI工程师对devm前缀打头的函数的使用有问题原创 2024-02-07 17:43:18 · 688 阅读 · 0 评论 -
将TI的电量计Linux驱动从4.4内核移植到5.10
在理解Linux和厂商代码的前提下,将报错的宏找到等价替代,或直接删除。原创 2024-01-20 11:55:07 · 1597 阅读 · 11 评论 -
增量式旋转编码器在STM32平台上的应用
将编码器输出的两路信号的其中一路当作触发器,检测另一路的电平高低,从而确定旋转方向。原创 2023-12-23 17:55:56 · 1379 阅读 · 0 评论 -
STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别
带IT后缀的版本只开启中断,实际的接收在中断回调里完成。原创 2023-11-18 17:23:58 · 7223 阅读 · 0 评论 -
从Linux的tty_struct指针获取驱动上下文
ctx = container_of(tty->port, struct gpib_tty_ctx, port);原创 2023-10-21 12:05:02 · 645 阅读 · 0 评论 -
一个Kbuild工程生成多个ko文件及其在驱动单元测试上的应用
给obj-m变量追加模块名原创 2022-09-02 09:18:38 · 735 阅读 · 0 评论 -
将USB转串口驱动pl2303从5.10内核向后移植(back port)到4.15内核
背景公司的USB转串口设备是绿联的,在windows上识别为[Prolific 旺玖科技](Prolific 旺玖科技股份有限公司)的pl2303系列,但是在ubuntu 1604.4(内核版本4.15)上无法驱动。运行lsusb能看到它的product id是0x23c3,浏览公司ftp上几个linux内核源码包,发现4.19也不支持该设备,支持的起码是5.x内核。失败的尝试:升级内核到5.10在1604上编译5.10内核,安装后启动失败。搜索资料得知ubuntu LTS版本包含2种内核,一种是原创 2021-11-20 08:24:15 · 913 阅读 · 0 评论 -
获取Linux内核卡死前的日志
Linux侧开启rsyslog的UDP转发,Windows侧用Visual Syslog Server for Windows查看原创 2021-09-10 18:16:30 · 10838 阅读 · 0 评论 -
USBTMC设备端驱动的一些开发心得
背景最近2个多月主要在忙USBTMC设备端驱动的重构,原来的驱动是参考gtzhai的github工程linux-driver-usbtmc-gadget,然后根据公司需求做了一堆单片机风格的魔改,可读性惨不忍睹,BUG不多但都很棘手,于是决定重构。重构后所有BUG都解决了,没解决的也知道为啥不能解决。为了对自己这段时间死掉的脑细胞聊表纪念(压力也有点大),决定将心得分享一下。重构思路首先让驱动能实现建链版本的驱动充斥着关中断操作,这使得设备不出错则已,一出错就是整机卡死的严重故障。于是我首先将所有原创 2021-08-23 14:52:12 · 5019 阅读 · 6 评论 -
Linux内核函数wait_event_interruptible的condition参数踩坑
wait_event简介wait_event_interruptible(以及wait_event打头的其他变体)是Linux的wait queue机制提供的线程同步接口,它的定义如下#define wait_event_interruptible(wq, condition) \({ \ int __ret = 0; \ might_sleep(原创 2021-07-06 11:55:28 · 2221 阅读 · 0 评论 -
用pcimem读写x64平台下的PCIE外设寄存器
背景在之前的一篇文章用devmem2读写设备IO内存中,我介绍了devmem2这个通过读写/dev/mem文件实现从用户空间访问外设寄存器的工具,但是对于PCIE设备,特别是FPGA模拟出来的自定义PCIE设备,该工具在x64平台下可能会发出64位的内存读写请求,而FPGA模拟的外设寄存器一般都映射到32位地址空间,此时x86就会卡死。x86驱动必须用ioread32接口来读写外设寄存器,而该接口无法被用户程序调用,不利用调试,于是就需要一种既能从用户空间访问,又能避免PCIE发出64位地址访问请求的方原创 2021-02-22 16:59:24 · 4624 阅读 · 1 评论 -
如何删除Ubuntu的GRUB启动项
问题有时候我们对编译的内核不满意,比如少打开了某个配置项什么的,想删除该版本内核,并让其从GRUB启动项中消失,但是直接改/boot/grub/grub.cfg不好,因为该文件是生成的,改/etc/default/grub更是缘木求鱼,所以只能是手工删除文件。解决可以看到,Ubuntu默认将内核的四大组成部分(内核镜像vmlinuz、内存磁盘initrd.img、符号表System.map、编译配置config)都放在/boot目录,那么可以猜测安装内核时make install是先将上述文件拷贝到该原创 2021-02-09 14:36:11 · 5276 阅读 · 4 评论 -
用devmem2读写设备IO内存
背景有时候定位Linux驱动BUG时,能看到外设的寄存器就很便于调试,但是临时写ioctl命令字不太现实,如果有一个像netcat那样的网络通用调试工具,是极好的。devmem2国外已经有人做了这个工具,名叫devmem2,体积很小,零依赖,代码也很简单,所以只有源码,没有编译好的deb、rpm等二进制包。用法:Usage: devmem2 { address } [ type [ data ] ] address : memory address to act upon type :原创 2021-02-05 17:35:07 · 8399 阅读 · 6 评论 -
container_of宏的一种高级用法
从数组的一个成员,反推出包含该数组的外围结构体问题驱动经常会注册各种回调,回调会对入参应用container_of宏,来得到外围对象的指针,从而访问外围对象的其他字段。有的时候,回调函数的入参,并不是想要访问的结构体的儿子字段,而是孙子字段,甚至是重孙子字段,并且这种嵌套关系可能并不是简单的结构体嵌套,而是数组嵌套,例如这样的:struct board{ int slot; int ip;};struct chassis{ int id; struct boar原创 2021-01-25 19:22:48 · 428 阅读 · 0 评论 -
如何给work回调函数传递用户参数
背景Linux驱动开发中,经常会用到work queue,该数据结构管理的是一个个的work_struct结构体:struct work_struct { atomic_long_t data; struct list_head entry; work_func_t func;#ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map;#endif};最近在做pcie驱动开发,有个需求是1个pcie端口传输5块采集卡的数据,每块卡的收发是独原创 2021-01-17 12:38:17 · 934 阅读 · 0 评论
分享