系统版本:Ubuntu18.04-64
编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1)
uboot版本:2018.07 -linux4sam_6.0
板子型号:at91sama5d3x-xplained
MCU型号:sama5d36
在一些特殊应用场景,在板子上电启动阶段就需要优先给IO进行上电,甚至是按照时序输出 ;比如:以前去广东电科院送检,有个检测项是4G模块在上电阶段,就要有RST信号出现1S低脉冲,然后ON/OFF信号200ms低脉冲,为了让4G模块和系统同步进入运行状态;就这么一个不起眼的操作,用单片机系统的厂家很快就解决了,我们使用Linux系统的搞起来有点繁琐,修改uboot,修改内核启动流程的代码。
linux开发相比单片机的主要难度就是无法在线仿真,调试手段打印,或者测量外部电平的变化。
一、查找到芯片初始化代码,理论上初始化完CPU时钟,DDR时钟之后就可以进行外围寄存器操作了;
1.1 调试内核驱动首先要了解芯片是属于哪个平台架构,atmel这款芯片mach-at91;其次就是开发板型号,参考官网开发板,这样可以少做很多无用功。
mach-at91下面有很多不同cpu型号的加载文件,每个里面都有初始化函数,该从哪里选择呢?
首先查看Makefile文件,可以看到里面有很多宏,要是不知道目前是哪个宏生效,可以先编译一次,然后查看这个目录下面有哪些文件编译出了.o文件,就可以说明是哪个宏生效了,我们要修改的是sama5.c;
二、进入sama5.c中查看对应的代码
//初始化函数
static void __init sama5_dt_device_init(void)
{
of_platform_default_populate(NULL, NULL, NULL);
sama5_pm_init();
}