本文接着上一篇文章叙述:https://blog.csdn.net/qq_44766222/article/details/124164895
项目场景:
基于sama5d27的嵌入式产品的软件开发,下面将描述一些我调试中遇到的一些问题,这个项目属于是我第一个linux应用项目,调试中遇到了一些小白性的问题,整体的调试思路为:分析源码-修改源码-编译源码-运行-分析源码。
问题1-flash芯片支持
同上文中提到的bootstrap遇到的问题类似,u-boot不支持我们项目上使用的flash。
问题解决
选择与激光器相匹配的SPI flash驱动,发现芯片型号与驱动里面的参数表不匹配,更改参数表,在u-boot编译选项中添加spi flash support 对测距机使用的flash的支持。
注:spiflash默认为20M,可以在spi_flash.h中修改spi总线的速率。
问题2-宏定义解释
相关宏定义的解释
#define CONFIG_SYS_TEXT_BASE 0x26f00000 :程序代码段存放于DDR中的起始地址
#define CONFIG_SYS_AT91_SLOW_CLOCK 32768 :ARM系统慢时钟
#define CONFIG_SYS_AT91_MAIN_CLOCK 24000000 : 使用的系统主时钟
问题3-u-boot
编译u-boot遇到的问题,编译提示 /bin/sh :1:bison:not found
解决方法
解决方法:
sudo apt install bison
如果还有类似的问题出现,解决方法象相同
问题4-kernel不能启动
在编译kernel成功并移植到板卡运行时,又出现了启动异常的情况。
解决方法
查找到是由于开发板与我们使用的芯片版本不一样,在官网下载相应版本的内核驱动,编译后运行成功。
记录4-系统分区设置
主要注意在传入内核的boot参数要与设备树中spi分区参数一致,下面把我的参数贴上来参考:
下面是u-boot的BOOTARGS
#define CONFIG_BOOTARGS \
"console=ttyS0,115200 noinitrd earlyprintk " \
"mtdparts=spi0.0:256k(bootstrap)ro,512k(uboot)ro," \
"256K(env),256k(env_redundent),256k(spare)," \
"512k(dtb),4M(kernel)ro,-(rootfs)rw " \
"root=/dev/mtdblock7 rootfstype=jffs2 atmel.pm_modes=upl0,upl1"
/* u-boot env in serial flash, by default is bus 0 and cs 0 */
/*read dtb from sf 0x180000 size 0x80000 to ddr 0x21000000
read zimage from sf 0x200000 size 0x384000 to ddr 0x22000000
*/
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_OFFSET 0xC0000
#define CONFIG_ENV_SIZE 0x20000
#define CONFIG_ENV_SECT_SIZE 0x20000
#define CONFIG_BOOTCOMMAND "sf probe 0; " \
"sf read 0x21000000 0x180000 0x80000; " \
"sf read 0x22000000 0x200000 0x400000; " \
"bootz 0x22000000 - 0x21000000"
下面是kernel 设备树的分区参数
bootstrap@0 {
label = "bootstrap";
reg = <0x0 0x40000>;
};
uboot@40000 {
label = "uboot";
reg = <0x40000 0x80000>;
};
env@0xC0000 {
label = "env";
reg = <0xC0000 0x40000>;
};
env_redundent@0x100000 {
label = "env_redundent";
reg = <0x100000 0x40000>;
};
spare@0x140000 {
label = "spare";
reg = <0x140000 0x40000>;
};
dtb@0x180000 {
label = "dtb";
reg = <0x180000 0x80000>;
};
kernel@200000 {
label = "kernel";
reg = <0x200000 0x0400000>;
};
rootfs@600000 {
label = "rootfs";
reg = <0x600000 0xA00000>;
};
记录5-使能gpio唤醒系统
这款芯片支持低功耗的功能,同时支持通过外部中断使系统从低功耗模式中唤醒,这里我们需要用GPIO来唤醒系统需要在设备树中配置gpio作为唤醒源,具体添加代码如下:
pb5 {
label = "USER";
gpios = <&pioA PIN_PC12 GPIO_ACTIVE_LOW>;
linux,code = <0x104>;
wakeup-source;
gpio-key,wakeup;
};
记录6-使用spiflash
在用户空间使用spi,按照下面的步骤实现:
1、编译内核时,使用官方提供的驱动,选择Device Drivers > SPI support><> User mode SPI device driver support/<> Atmel SPI Controller;
2、修改设备树节点
spi1: spi@fc000000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1_default>;
status = "okay";
spidev@0 {
compatible = "rohm,dh2228fv";
reg = <0>;
spi-max-frequency = <11000000>;
};
spidev@1 {
compatible = "rohm,dh2228fv";
reg = <1>;
spi-max-frequency = <11000000>;
};
spidev@2 {
compatible = "rohm,dh2228fv";
reg = <2>;
spi-max-frequency = <11000000>;
};
};
3、这个时候就可以走文件系统dev目录下看到spix.y设备,这个时候便可使用对应的spi端口
记录7-添加jffs文件系统支持
本系统使用的flash为spi flash,建议使用的文件系统为jffs2,开发板提供的文件系统为ubifs,不能够很好的支持测距机使用的flash,按照下图修改内核配置,使支持jffs2文件系统:
问题8-编译设备树出现的问题
编译设备树出现dt-bindings/dma/at91.h:no such file or directory如下图:
解决方法
修改Makefile.lib文件,添加设备树查找头文件的目录:
大家有问题可以相互讨论,我也是小白,微信 yucaohua001