驱动开发
文章平均质量分 76
六个九十度
嵌入式软件工程师
展开
-
将RK3588平台的TMC等USB function驱动挪出内核源码树
先加载ko,再在configfs里执行mkdir func、ln -s func config/、echo gadget > UDC三步骤原创 2024-09-04 15:01:37 · 495 阅读 · 0 评论 -
基于USB host控制器实现的TMC驱动
跨性别的USB-TMC原创 2024-08-09 17:44:07 · 846 阅读 · 0 评论 -
支持高带宽数据采集卡的XDMA优化之路
XDMA存在非常多的优化点,希望这些优化措施能帮到你原创 2024-08-20 19:25:52 · 1208 阅读 · 0 评论 -
基于GT911触控IC的电容屏在MSP430上的驱动
GT911的COOR_ADDR寄存器只要读了,就一定要写0清零,切记。原创 2024-03-16 11:45:35 · 1193 阅读 · 0 评论 -
STM32作为SPI slave与主机异步通信
slave开机后处于SPI接收主机command状态,收到用户输入后abort当前的接收,进入SPI发送状态,发送完毕后,恢复接收command状态。原创 2024-03-02 16:57:20 · 1626 阅读 · 0 评论 -
TI的电量计驱动在卸载时导致Linux卡死
TI工程师对devm前缀打头的函数的使用有问题原创 2024-02-07 17:43:18 · 493 阅读 · 0 评论 -
将TI的电量计Linux驱动从4.4内核移植到5.10
在理解Linux和厂商代码的前提下,将报错的宏找到等价替代,或直接删除。原创 2024-01-20 11:55:07 · 794 阅读 · 9 评论 -
增量式旋转编码器在STM32平台上的应用
将编码器输出的两路信号的其中一路当作触发器,检测另一路的电平高低,从而确定旋转方向。原创 2023-12-23 17:55:56 · 1033 阅读 · 0 评论 -
STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别
带IT后缀的版本只开启中断,实际的接收在中断回调里完成。原创 2023-11-18 17:23:58 · 3913 阅读 · 0 评论 -
从Linux的tty_struct指针获取驱动上下文
ctx = container_of(tty->port, struct gpib_tty_ctx, port);原创 2023-10-21 12:05:02 · 559 阅读 · 0 评论 -
一个Kbuild工程生成多个ko文件及其在驱动单元测试上的应用
给obj-m变量追加模块名原创 2022-09-02 09:18:38 · 504 阅读 · 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 · 762 阅读 · 0 评论 -
获取Linux内核卡死前的日志
Linux侧开启rsyslog的UDP转发,Windows侧用Visual Syslog Server for Windows查看原创 2021-09-10 18:16:30 · 8333 阅读 · 0 评论 -
USBTMC设备端驱动的一些开发心得
背景最近2个多月主要在忙USBTMC设备端驱动的重构,原来的驱动是参考gtzhai的github工程linux-driver-usbtmc-gadget,然后根据公司需求做了一堆单片机风格的魔改,可读性惨不忍睹,BUG不多但都很棘手,于是决定重构。重构后所有BUG都解决了,没解决的也知道为啥不能解决。为了对自己这段时间死掉的脑细胞聊表纪念(压力也有点大),决定将心得分享一下。重构思路首先让驱动能实现建链版本的驱动充斥着关中断操作,这使得设备不出错则已,一出错就是整机卡死的严重故障。于是我首先将所有原创 2021-08-23 14:52:12 · 3697 阅读 · 5 评论 -
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 · 1638 阅读 · 0 评论 -
定制hexdump的打印输出格式
背景hexdump是Linux系统下一个以十六进制或ASCII形式输出文件内容的工具,通常-b -c -C -d等选项提供的打印格式就够用了,但有时板卡输出的数据格式比较特殊,想用文本比较工具(例如kidff3)比对的话,就需要将hexdump的输出指定成匹配的格式自定义格式串通常使用-e选项传递自定义格式串。简介hexdump的自定义格式串由任意多个格式单元组成每个格式单元由3个基本元素组成:迭代数字节数模式串模式串这个是最好理解的,跟printf的模式串非常像,%d表示打印十进原创 2021-04-26 16:07:22 · 2050 阅读 · 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 · 3709 阅读 · 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 · 4339 阅读 · 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 · 6047 阅读 · 5 评论 -
container_of宏的一种高级用法
从数组的一个成员,反推出包含该数组的外围结构体问题驱动经常会注册各种回调,回调会对入参应用container_of宏,来得到外围对象的指针,从而访问外围对象的其他字段。有的时候,回调函数的入参,并不是想要访问的结构体的儿子字段,而是孙子字段,甚至是重孙子字段,并且这种嵌套关系可能并不是简单的结构体嵌套,而是数组嵌套,例如这样的:struct board{ int slot; int ip;};struct chassis{ int id; struct boar原创 2021-01-25 19:22:48 · 314 阅读 · 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 · 786 阅读 · 0 评论