<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[duapple的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/duapple</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; duapple]]></copyright><item><title><![CDATA[Golang基于反射的ioctl实现]]></title><link>https://blog.csdn.net/duapple/article/details/147999625</link><guid>https://blog.csdn.net/duapple/article/details/147999625</guid><author>duapple</author><pubDate>Fri, 16 May 2025 09:53:53 +0800</pubDate><description><![CDATA[调用会失败，报错：inappropriate ioctl for device。32位平台和64位平台在内核中使用ioctl不一样，如果内核中只实现了 unlocked_ioctl ，就会报上面的错误。第二个，也是指定了64位平台，那么golang下的int和uint将变成64bit，即8字节，因此如果要使用4字节的长度，最好直接用int32和uint32。还有两个比较坑的事情。，交叉编译到ARM平台时，指定。，如果使用的是arm64平台，记录下首次使用反射特性。]]></description><category></category></item><item><title><![CDATA[七、GPIO中断控制器（2）—— pcf8575]]></title><link>https://blog.csdn.net/duapple/article/details/146488199</link><guid>https://blog.csdn.net/duapple/article/details/146488199</guid><author>duapple</author><pubDate>Mon, 24 Mar 2025 22:55:57 +0800</pubDate><description><![CDATA[上一小节，已经完成了基础的中断控制器驱动。现在需要完善并解决边缘检测的问题。这里可以参考驱动，仿造着它来实现，也可以直接参考驱动，这个官方的驱动。后者使用的是 gpiolib_irqchip 的新版本API，实现起来较为简单，需要在config中配置。这里介绍旧版本的API使用，无太大差异。]]></description><category></category></item><item><title><![CDATA[六、GPIO中断控制器（1）—— pcf8575]]></title><link>https://blog.csdn.net/duapple/article/details/146438584</link><guid>https://blog.csdn.net/duapple/article/details/146438584</guid><author>duapple</author><pubDate>Sat, 22 Mar 2025 14:44:50 +0800</pubDate><description><![CDATA[完成一个GPIO扩展芯片的GPIO驱动后，可以使用上一节实现的驱动进行简单的GPIO控制，但是对于中断输入功能，该驱动是不支持的。因此要实现完整的GPIO扩展芯片驱动，还需要使用内核中的中断子系统来实现中断功能。pcf8575是支持中断功能的，有一个中断引脚，在pcf8575的16个GPIO引脚发生电平变化时，会在终端引脚上发送脉冲信号。我们可以通过SoC的一个中断引脚来实现中断输入检测，只要检测到中断信号后，就能通过I2C通信读取GPIO扩展芯片的GPIO电平状态，找到真正触发中断的GPIO引脚。]]></description><category></category></item><item><title><![CDATA[记录两个内核模块开发的坑]]></title><link>https://blog.csdn.net/duapple/article/details/146395623</link><guid>https://blog.csdn.net/duapple/article/details/146395623</guid><author>duapple</author><pubDate>Thu, 20 Mar 2025 14:19:03 +0800</pubDate><description><![CDATA[在remove函数中调用导致问题。timer的正常用法就时应该在remove函数中调用这个API进行释放。但是这里确遇到了问题，被告知timer是一个静态对象。由于需要在timer的回调里面使用自己的数据结构，因此只能使用静态分配的方式，然后通过container_of去获取自己的数据结构。按道理来说是不应该panic的。后来通过添加日志发现，是自己的数据结构的内存踩了，由于使用了void *作为函数参数，在传参时，错误的将自己的数据结构传进去了，导致timer对象内存被覆盖了导致的这个问题。]]></description><category></category></item><item><title><![CDATA[五、SPI客户端驱动——bmp280]]></title><link>https://blog.csdn.net/duapple/article/details/146289407</link><guid>https://blog.csdn.net/duapple/article/details/146289407</guid><author>duapple</author><pubDate>Sun, 16 Mar 2025 03:49:32 +0800</pubDate><description><![CDATA[spi子系统类似i2c子系统，驱动注册方式和i2c类似。没有什么可说的，主要区别在于SPI总线会多两个信号线。]]></description><category></category></item><item><title><![CDATA[记录一个FreeRTOS堆栈溢出的问题]]></title><link>https://blog.csdn.net/duapple/article/details/145566454</link><guid>https://blog.csdn.net/duapple/article/details/145566454</guid><author>duapple</author><pubDate>Tue, 11 Feb 2025 10:56:21 +0800</pubDate><description><![CDATA[针对单片机平台，在函数体实现中，如果要分配大容量的内存，最好是使用堆上分配的方式。]]></description><category></category></item><item><title><![CDATA[四、GPIO控制器驱动 —— pcf8575]]></title><link>https://blog.csdn.net/duapple/article/details/145331354</link><guid>https://blog.csdn.net/duapple/article/details/145331354</guid><author>duapple</author><pubDate>Fri, 24 Jan 2025 00:50:32 +0800</pubDate><description><![CDATA[PCF8575 是一个16bit的GPIO扩展芯片，可以支持两组共16个GPIO的控制。但是由于较为简单，16个GPIO只能同时被配置为输入或者输出，不支持对单个GPIO的控制特殊控制。使用I2C通信，拥有一个中断引脚。电压支持2.5~5.5V，连接5V的输入，GPIO输出将支持到3.3V。]]></description><category></category></item><item><title><![CDATA[三、I2C客户端驱动 —— htu21d]]></title><link>https://blog.csdn.net/duapple/article/details/145290776</link><guid>https://blog.csdn.net/duapple/article/details/145290776</guid><author>duapple</author><pubDate>Tue, 21 Jan 2025 22:15:23 +0800</pubDate><description><![CDATA[和bmp280一样，使用i2c驱动注册。需要注意的是，设备reset需要15ms，可以使用读出来的第三个字节作为CRC8校验码，进行数据校验。另外，温湿度计算公式如果使用小数，可能编译器默认的参数不支持，可以将小数转化为整数进行计算。另外，htu21d的i2c支持两种模式，hold master模式支持SCL stretching，更加方便我们主机端读取数据，设备会在数据ADC采集完成之前，控制SCL，不让master继续后续操作，再数据完成采集后，再释放SCL，master才进行后续读取操作。]]></description><category></category></item><item><title><![CDATA[二、设备-驱动 匹配机制探究]]></title><link>https://blog.csdn.net/duapple/article/details/145244486</link><guid>https://blog.csdn.net/duapple/article/details/145244486</guid><author>duapple</author><pubDate>Sun, 19 Jan 2025 18:01:15 +0800</pubDate><description><![CDATA[Linux总线和设备都会注册到总线驱动上，然后在添加新驱动时，会进行匹配查找，将适合的设备和驱动进行绑定，并将设备和驱动注册显示在sys的层级结构种去。当在使用i2c设备驱动时，遇到一个问题，一般会将定义i2c_device_id结构，注册到驱动的.id_table中去。再顶一个of_device_id，用于设备树风格的设备驱动匹配。按理来说，如果使用设备树匹配风格，那么不定义i2c_device_id结构应该也是可以的。]]></description><category></category></item><item><title><![CDATA[一、I2C客户端驱动 —— bmp280]]></title><link>https://blog.csdn.net/duapple/article/details/145193431</link><guid>https://blog.csdn.net/duapple/article/details/145193431</guid><author>duapple</author><pubDate>Thu, 16 Jan 2025 23:44:53 +0800</pubDate><description><![CDATA[在开始转Linux驱动开发的时候，就计划着把约翰·马迪厄的Linux设备驱动开发看完，然后找一些器件把上面的驱动实验都做一下的。因为各种各样的原因，一直没有做这个事情。现在也算是做了一点项目，计划深入并复习一下。于是乎，专门开个专栏记录一下，适配各个器件驱动的过程，内核API使用，驱动开发注意事项，以及调试代码。方便自己使用的时候查看，也为正在学习的童鞋做一个分享。Linux设备驱动开发并没有想象的那么难，难点主要还是在对芯片的了解，芯片的使用上，主要工作量还是在阅读理解芯片手册上面。]]></description><category></category></item><item><title><![CDATA[记录一个FreeRTOS任务被抢占的问题]]></title><link>https://blog.csdn.net/duapple/article/details/145001527</link><guid>https://blog.csdn.net/duapple/article/details/145001527</guid><author>duapple</author><pubDate>Wed, 08 Jan 2025 10:41:03 +0800</pubDate><description><![CDATA[由于FreeRTOS使用的是抢占式的任务调度机制，因此任务必须要让出CPU，其它相同优先级的任务才能被调度执行。或者主动调用任务调度API来解决这个问题。当在任务中使用了while(1) 死循环的代码时，可能会导致其它相同优先级的任务无法切换，导致出现被无限抢占不执行的情况。如果是使用相同任务时间片轮转的任务调度机制，那么将不会出现这个问题。FreeRTOS支持配置时间片轮转的调度功能。]]></description><category></category></item><item><title><![CDATA[解决一个android service启动无法开文件的问题]]></title><link>https://blog.csdn.net/duapple/article/details/142934341</link><guid>https://blog.csdn.net/duapple/article/details/142934341</guid><author>duapple</author><pubDate>Tue, 15 Oct 2024 08:58:02 +0800</pubDate><description><![CDATA[这里我抄了一个demo的 rc 配置，使用的 class 是 hal，user 和 group 都是system，android 系统中只有root权限和非root权限。调试阶段，我直接将service push到板卡上，进行调试，未出现问题无法开的问题。接下来报除了一些 uinput 相关的 avc 权限问题，将需要的权限添加到 te 文件中即可，可能需要多次调试添加。自己定义的权限和全局设置的权限要求冲突了。avc 相关的已经在集成时，解决了所有的 avc 报错。还有与权限相关的就是 rc 文件了。]]></description><category></category></item><item><title><![CDATA[解决 make_ext4fs is not find, it is recommanded to install android-tools-fsutils]]></title><link>https://blog.csdn.net/duapple/article/details/139475700</link><guid>https://blog.csdn.net/duapple/article/details/139475700</guid><author>duapple</author><pubDate>Wed, 05 Jun 2024 16:44:14 +0800</pubDate><description><![CDATA[编译cluster linux时，遇到make_ext4fs命令无法找到。这个工具是被软件包 android-tools-futils 包含的。这个软件包只支持18.04的系统，在ubuntu20.04和ubuntu22.04上，无法被正确的安装。会报依赖问题，报错的信息是依赖python相关的，但是又没有指定一个版本。这个命令是被构建系统依赖的，因此没办法使用其它更新的版本。虽然可以直接安装deb包，但是每次使用apt install 时，都会报这个相关的错误。使用。]]></description><category></category></item><item><title><![CDATA[QLabel无法显示图片]]></title><link>https://blog.csdn.net/duapple/article/details/135007319</link><guid>https://blog.csdn.net/duapple/article/details/135007319</guid><author>duapple</author><pubDate>Fri, 15 Dec 2023 00:58:18 +0800</pubDate><description><![CDATA[转载于：https://blog.csdn.net/qiangzi4646/article/details/80764262。]]></description><category></category></item><item><title><![CDATA[gpio-export配置默认gpio]]></title><link>https://blog.csdn.net/duapple/article/details/134527524</link><guid>https://blog.csdn.net/duapple/article/details/134527524</guid><author>duapple</author><pubDate>Tue, 21 Nov 2023 11:14:23 +0800</pubDate><description><![CDATA[用于设置gpio的默认状态和导出用户空间借口。只需要在设备树中配置节点即可。]]></description><category></category></item><item><title><![CDATA[udhcpc dhcpcd 区别]]></title><link>https://blog.csdn.net/duapple/article/details/134484762</link><guid>https://blog.csdn.net/duapple/article/details/134484762</guid><author>duapple</author><pubDate>Sat, 18 Nov 2023 22:14:33 +0800</pubDate><description><![CDATA[参考：
https://forums.gentoo.org/viewtopic-t-1072758-start-0.html]]></description><category></category></item><item><title><![CDATA[patch 生成合入补丁]]></title><link>https://blog.csdn.net/duapple/article/details/134463127</link><guid>https://blog.csdn.net/duapple/article/details/134463127</guid><author>duapple</author><pubDate>Fri, 17 Nov 2023 14:52:06 +0800</pubDate><description><![CDATA[由于需要对比的目录文件数量非常多，如果是完全比较是非常慢的，如果只是少量的修改，并且我们是知道具体路径的，那么，我们不需要完全对比这两个目录，只读取我们修改的目录即可。针对上述操作，已经针对最开始的文件夹，生成了我们修改后产生的补丁文件。通过diff命令，可以为两个的目录生成差异补丁，这样，可以对于文件夹文件的修改，我们可以得到一个修改操作的补丁文件。可以将其中一个目录软链接到另一个目录的同级目录，也可以把两个目录都进行软链接，软链接到同一个目录下即可。即合入补丁后，可以通过这个参数撤销合入的补丁。]]></description><category></category></item><item><title><![CDATA[配置Linux为无线路由器]]></title><link>https://blog.csdn.net/duapple/article/details/134293398</link><guid>https://blog.csdn.net/duapple/article/details/134293398</guid><author>duapple</author><pubDate>Wed, 08 Nov 2023 16:50:34 +0800</pubDate><description><![CDATA[将Linux配置为无线路由器。使用hostapd，可以配置无线网卡为AP模式。这里使用buildroot来生成这个工具。Wi-Fi模块使用的是 rt8188eus。]]></description><category></category></item><item><title><![CDATA[解决buildroot中fakeroot执行很慢的问题]]></title><link>https://blog.csdn.net/duapple/article/details/134246217</link><guid>https://blog.csdn.net/duapple/article/details/134246217</guid><author>duapple</author><pubDate>Mon, 06 Nov 2023 14:50:19 +0800</pubDate><description><![CDATA[在使用docker容器作为buildroot环境时，生成文件系统时，buildroot会使用fakeroot来设置一些文件权限。曾经生成文件系统是非常快的，最近使用docker容易，生成文件系统时，速度变的非常慢。尝试更换到ubuntu下，速度是没有问题，那么就是容器的问题。网上搜了一些，说是golang的bug导致的。再次测试编译打包，速度飞快。]]></description><category></category></item><item><title><![CDATA[hi3518ev200 从sd卡启动rootfs]]></title><link>https://blog.csdn.net/duapple/article/details/134235345</link><guid>https://blog.csdn.net/duapple/article/details/134235345</guid><author>duapple</author><pubDate>Sun, 05 Nov 2023 21:31:17 +0800</pubDate><description><![CDATA[板卡为 hisi 的 hi3518ev200，16M RAM，64M Flash。板卡不支持从SD卡启动，但是由于Flash空间有限，很多应用都放不下，因此考虑把 rootfs 放到 SD 卡中。先从 Flash 中启动 kernel，然后再加载 SD 卡中的 rootfs。]]></description><category></category></item></channel></rss>