u-boot for tiny210 ver2.1(by liukun321咕唧咕唧)

前两次修改的u-boot写SD卡的过程存在问题,虽然保存环境变量到SD能够成功,但是会有Writing to MMC(0)... mmc_send_cmd: error during transfer: 0x00208001 mmc write failed,这样的提示。而且每次启动只能够保存一次环境变量,若再次写SD卡会有failed提示并无法保存。这一次更新修复了这两个bug。

ver2.1源码下载:u-boot for tiny210 ver2.1

下面的链接提供了前两次修改的源码

ver1.0源码下载:u-boot for tiny210 ver1.0
ver2.0源码下载:u-boot for tiny210 ver2.0

你还可以参考下面两篇blog从头构建自己的u-boot for tiny210

ver1.0   ver2.0

 

ver2.1的基本功能:

1. SD boot,基于linaro u-boot的SPL功能实现

2. 从SD卡的FAT分区上加载文件到SDRAM

3. 将环境变量保存至SD卡

4. 添加DM9000网卡驱动,开启网络功能(例如:tftp,nfs等)

5. 添加TAB键命令自动补全功能

+6.修复bug:

修复bug 1:SD卡保存环境变量出现Writing to MMC(0)... mmc_send_cmd: error during transfer: 0x00208001 mmc write failed。

修复bug 2:每次启动只能保存一次环境变量。

 

ver2.1代码改动量非常小,一步就可完成,但是由于经验不足,我在bug的定位上花了很多时间.

具体修改如下:

drivers/mmc/s5p_mmc.c 屏蔽红字部分即可.
231:if (data) {
                while (1) {
                        mask = readl(&host->reg->norintsts);
                        //e_num++;
                 /*      if (mask & (1 << 15)) {
                                                                writel(mask, &host->reg->norintsts);
                                printf("%s: error during transfer: 0x%08x\n",
                                                __func__, mask);
                                
                                                        return -1;
                                                                       } else*/  if (mask & (1 << 3)) {


 

编译u-boot
$make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_config
$make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl
由于我的系统下装有两套交叉工具链,所以没有把  /opt/FriendlyARM/toolschain/4.5.1/bin/ 添加到环境变量,在使用工具链时要指明路径。

将u-boot镜像写入SD卡
将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.

执行下面的命令
$sudo dd iflag=dsync oflag=dsync if=spl/tiny210-spl.bin of=/dev/sdb seek=1
$sudo dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb  seek=49
 
 
将SD卡插入开发板启动:

 

测试saveenv:

 

 

PS : 简单记录解决过程

错误的打印出处的确不难找,printf("%s: error during transfer: 0x%08x\n",   __func__, mask);即是.可是仔细看看被屏蔽部分代码是没什么问题的,

 if (mask & (1 << 15)) {

                                 writel(mask, &host->reg->norintsts);
                                printf("%s: error during transfer: 0x%08x\n",
                                                __func__, mask);
                                
                                                        return -1;
                                                                       }
是对210 NORINTSTS寄存器的第15位进行判断是否为1,及是否存在error status.
若error状态位为1,则返回,则会导致写失败,如果读SD卡,data= NULL 则if (data) 不满足,不会进入这个循环.
分析起来这部分代码貌似也不是错误所在。于是把查找重点放在SD卡控制寄存器的配置,及读写流程上。分
析了几个小时依然不能发现问题.
 
0x00208001按照这个错误号,对照NORINTSTS寄存器表,可以发现这个提示是CRC校验报的.关CRC校验是
万万不能的,于是试了一下强制不检测NORINTSTS寄存器的 第15bit.如果写过程真有错误,不通过
if (mask & (1 << 15)) {
                                  writel(mask, &host->reg->norintsts);
                                printf("%s: error during transfer: 0x%08x\n",
                                                __func__, mask);
                                
                                                        return -1;
                                                                       }
 
是不会退出循环的。于是屏蔽上面那段代码后,重新saveenv.提示:done 问题解决了,但是感觉这中强制手段不
是最安全的,我曾认为是延时不足导致的,于是作如下修改:
if (mask & (1 << 15)) {
                                int e_num;
                                for(e_num = 0;e_num<100;e_num++)
                                udelay(1000);
                                mask = readl(&host->reg->norintsts);
                        if (mask & (1 << 15)) { 
                                writel(mask, &host->reg->norintsts);
                                printf("%s: error during transfer: 0x%08x\n",
                                                __func__, mask);
                                
                        //printf("mask = %x,e_mum = %d\n",mask,e_num);
                                return -1;
                                                }
                        }
但是依然不能解决问题,没办法只好暂且屏蔽它.
如果大家发现更好的解决方式,要留言啊.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值