调试at91-sama5d27遇到的一些问题(1)

项目场景:

基于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值