项目场景:
基于sama5d27的嵌入式产品的软件开发,下面将描述一些我调试中遇到的一些问题,这个项目属于是我第一个linux应用项目,调试中遇到了一些小白性的问题,整体的调试思路为:分析源码-修改源码-编译源码-运行-分析源码。
sama5d27做linux操作系统移植裁剪的时候与其他的多数arm芯片不一样,它是由bootstrap,u-boot,kernel,fs构成,比其他的多了一个需要烧写的bootstrap,就像zynq芯片的fsbl一样,下面对遇到问题进行描述。
bootstrap遇到的问题
程序不运行
问题1
使用j-tag将程序下载到ddr中,将程序指针设置到起始位置,程序不运行。
原因分析与问题解决
1、原本程序有问题
将程序下载到片上ram0区域,此芯片0x200000-0x220000为SRAM0区域,执行代码,发现程序能够正常运行,说明我编写的程序是正确的。
2、DDR初始化不正确
将程序烧写进ddr中,然后再读取出来对比,观察发现数据不一致,确定DDR初始化异常,经过排查发现我们使用的芯片型号和我编译的bootstrap版本不一致,最后在官网下载到了正确的版本 ,重新编译再运行后,发现程序任然有问题。
3、硬件问题
这里我们验证了程序版本正确,程序运行正确开始怀疑是否硬件有问题,因为ddr属于是高速信号,硬件设计或者生产的不足会影响使用频率,我将ddr降频使用后,再运行,程序执行正确,ddr代码的位置在board/sama5d27_ek_ek.c中的ddr2_init()函数里。
问题2
使用了bootstrap中不支持的flash。
解决方法
在官网提供的bootsrap中,不支持我们选择的芯片型号,修改spi_flash.c中的配置
A 修改/JEDEC Code/使得支持本芯片的ID号,修改方式为增加宏定义
#define MANUFACTURER_ID_MACRONIC 0xc2 ,
增加/* Family Code /宏定义
#define DF_FAMILY_MX25L 0x20 / AT45 Density Code /
#define DENSITY_MX25L128 0x18 / */
B 增加初始化函数
static int df_mx25_desc_init(struct dataflash_descriptor *df_desc)
{
df_desc->pages = 524288;
df_desc->page_size = 256;
df_desc->page_offset = 0;
df_desc->is_spinor = 1;
return 0;
}
C 修改df_desc_init函数,增加以下语句
case MANUFACTURER_ID_MACRONIC:{
if (df_desc->family == DF_FAMILY_MX25L) {
ret = df_mx25_desc_init(df_desc);
if (ret)
return ret;
}else {
dbg_info("SF: Unsupported SerialFlash family %x\n", family);
return -1;
}
}
D 修改dataflash_probe_atmel函数,修改
if (dev_id[0] != MANUFACTURER_ID_ATMEL &&
dev_id[0] != MANUFACTURER_ID_WINBOND &&
dev_id[0] != MANUFACTURER_ID_MICRON) {
dbg_info("Not supported spi flash Manufactorer ID: %x\n",
dev_id[0]);
return -1;
}
为以下语句
if (dev_id[0] != MANUFACTURER_ID_ATMEL &&
dev_id[0] != MANUFACTURER_ID_WINBOND &&
dev_id[0] != MANUFACTURER_ID_MICRON &&
dev_id[0] != MANUFACTURER_ID_MACRONIC) {
dbg_info("Not supported spi flash Manufactorer ID: %x\n",
dev_id[0]);
return -1;
}
E 增加宏定义
#define AT91C_SPI_PCS_DATAFLASH 0,表示片选0
F 增加以下变量的赋值操作image->length = 0x80000;
image->offset = 0x40000;
image->dest = 0x26f00000;
G 编译修改的代码,使支持spi flash启动
测试阶段,为了禁止bootstrap引导u-boot启动,在编译选项image loading strategy选择do not load any image…,测试阶段完成,进入正常运行阶段后,在编译选项中选择load u-boot into last MBYTE of SDRAM。根据u-boot编译情况修改 u-boot image storage setup参数,The External Ram Address to Load U-Boot Image可以从u-boot文件夹system.map中得到26f00000 T __image_copy_start,其他参数则根据烧写flash时候的偏移、大小来确定。
大家有问题可以相互讨论,我也是小白,微信 yucaohua001