这几天期末复习,摸鱼改了下驱动,改的时候走了点弯路,本来一个小时的事情,折腾了一天(dts两个GPIO反了,最后才检查出来)。
首先说一下ESP8089-SPI源码之前存在的错误:模块在init中采用老方法(板级描述文件)向SPI总线注册device,同时构造driver和device进行匹配挂载,而在exit中,我不是很清楚哪里有问题,导致模块exit的时候device没有被删除(懒得去追踪了),导致二次模块init的时候,SPI总线上会显示device已被注册,模块报错退出。
具体表现在insmod esp8089-spi.ko再rmmod esp8089-spi.ko再insmod esp8089-spi.ko时报错,在debug的时候很烦,不影响正常使用。
修改方法:在init的时候,向SPI总线读取总线上的设备,如果有设备占用,强制删除device(模块里不推荐这么使用,但是我觉得简单有用)
还有一个问题是interrupt中断检测的时候最后延时零点几秒,增加模块加载成功的概率?不是很清楚这么做到底有没有用,之前有一版板子这么做有用。
*修改后的功能,通过设备树进行配置,可选参数reset,interrupt,debug。
*支持Kbuild进行配置,已修改整合进driver/staging/esp8089里,menuconfig选中后直接编译就OK了。
另外,先问一下,如果我修改了ESP8089源码再上传会不会侵犯乐鑫公司版权啊。。。妹问题我就上传代码了
原项目地址: https://github.com/notabucketofspam/ESP8089-SPI
还有,感谢迪卡大佬指导。
测试用的板子:
离线
*你需要的做的事情,把该文件解压到内核源码/driver/staging/下
修改内核源码/driver/staging/下的Kuild文件,添加:
source "drivers/staging/esp8089/Kconfig"
修改内核源码/driver/staging/下的Makefile
obj-$(CONFIG_ESP8089) += esp8089/
接着返回内核源码所在目录,输入:make menuconfig(buildroot请输入 make linux-menuconfig) 然后选中ESP8089,里面选中SPI编译即可。
设备树的配置如下:
&spi1 {
status = "okay";
esp8089@0 {
status = "okay";
compatible = "boss,esp8089";
spi-cpol;
spi-cpha;
reg = <0>;
spi-max-frequency = <30000000>;
reset= <104>;
interrupt= <103>;
debug= <0>;
};
};
请根据实际情况进行修改reset和interrupt。
离线
下载链接如下:Github还需要整理一下esp8089.zip
离线
哦对,还有一个小问题我至今不知道怎么回事,以外部模块进行编译的时候开机不会自动加载esp8089_spi.ko,需要手动输入modprobe esp8089_spi或者编译的时候选择编译到内核里
离线
先别急着下载,好像上传错了一版代码,我调试一下看看。
离线