文章目录
在编译uboot成功之后,烧录到板子里。
第一个问题 PMIC
在烧录进板子里后,通过串口连上板子观察板子的信息;
板子启动,灯亮了,供电锁存了,但是串口并没有信息,所以我们确定了需要修改的大致范围在 start.S 中我们做了中断处理、设置状态寄存器cpsr、设置cache、mmu、确定启动介质sd/nand。
然后调用lowlevel_init。这个函数是对一些底层的东西进行初始化。
首先是 压栈,在我们调用lowlevel_init时我们不确定或者确定要再调用函数时,就需要压栈。因为阿巴阿巴阿巴;
检测复位状态,冷启动热启动;
IO状态恢复
关看门狗
供电锁存(重点)
PMIC(电源管理IC) (问题出处)
初始化时钟
初始化DDR
初始化串口(重点)
然后大致的范围就确定好了。
因为我们所以值得板子里并没有PMIC芯片,所以我们把这个PMIC跳转语句注释掉。
编译烧录。
看启动信息,CPU是没什么问题的、serial、board也没问题
DRAM:1G 有问题。
SD/MMC 有问题;SD卡初始化失败了
NAND 板子里没有装NAND,所以为0。
第二个问题 DDR
名字
在lib_arm/board.c
位置在board/samsung/smdkc110/lowlevel_init.S
修改是名字
DDR的start和size
通过 bdinfo 命令来查看DRAM的信息。
在通过 md 命令 md 20000000 10
确定DDR是否能使用,能使用的话说明DDR的初始化是没有问题的。
DRAM的start是可以通过软件改变的;size 应该为10000000。
将DDR端口0地址配置为30000000
(smdkv210single.h)
要修改DDR的地址需要三个地方
1 设置MEMCONFIG_0 寄存器为0x30F01323
板子里边与DDR相关的寄存器 MEMCONFIG_0 的设置 0x30F01323
30 指的是 起始地址为 0x30000000 F0 指的是 DDR大小的补码(大小为 0FFF_FFFF 256M )
![在这里插入图片描述](https://img-blog.csdnimg.cn/1f43894e7ea14def9f506262a00a18d0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oao5oaoQA==,size_20,color_FFFFFF,t_70,g_se,x_16)
2 在软件显示的DDR的起始地址,size ,start。
3 修改DDR1的地址映射
从start.S 开始找 _mmu_table_base 指针
找到定义处
在 smdkc110 中的lowlevel_init.S
编译 烧录
这个时候又出现了一个问题SD/MMC: 没有反应
第三个问题 SD/MMC
SD/MMC: 没有反应 ;这说明在打印SD/MMC:之后的代码出现了问题;然后在打印SD/MMC的信息之前。所以我们在这个范围内寻找。
打印MMC的代码在lib_arm/board.c中
打印SD/MMC信息是在mmc_initialize函数中,
然后在排查,因为在我们没有修改之前是可以启动的,在修改DDR的起始地址之后就出问题了,
所以问题是和内存相关的(也可以使用断点排查)
配置文件smdkv210single.h
配置文件smdkc110/smdkc110.c
编译烧录
能工作,但是SD/MMC还是有有问题;这个时候我们不知道错误在哪里,就在source insight 里错误代码中的关键字如 EXT_CSD 。
第四个小问题
查找 EXT_CSD
经过查看上下文
因为版本的问题这份uboot中不支持高版本的SD。所以我们可以跳过或解决这个问题。ext_csd_struct 里边存放了SD的版本,通过修改if语句的判断值,就该为 8,原来为5.
编译烧录
第五个小问题 串口
如何修改 串口
已修改到串口0上
位置include/s5pv210.h
串口的初始化在lowlevel_init.S中
第六个小问题 修改默认的网络地址和提示符
1 网络地址
修改配置头文件smdkv210single.h中的CONFIG_IPADDR等宏,则可以修改uboot的默认环境变量
如果说修改了还是没反应,那应该是INAND中的ENV分区已经保存了一份环境变量。所以要擦除那份才能看到现象。
mmc write 0 30000000 11# 32
(表示将DDR的0x30000000开头的一段内存中的内容写入iNand中的第17个扇区开始的32个扇区内,写入长度是32个扇区长度(16KB))
2 提示符
修改配置头文件smdkv210single.h
第七个问题 网卡DM9000
查找与网卡相关的配置代码
在cpu/s5pc11x/start.S
start_armboot 函数
在lib_arm/board.c 中
init_sequence 是个结构体
在 lib_arm/board.c
board_init
在 board\samsung\smdkc110\Smdkc110.c
dm9000_pre_init 函数
board\samsung\smdkc110\Smdkc110.c
修改配置文件
寄存器 MP01CON_REG
通过查看引脚图发现,37硬件接的是CSn1,所以得连接相对应的位;这里我面配置的是bit4~bit7。
寄存器 SROM_BW
通过查看引脚图发现,37硬件接的是CSn1,所以得连接相对应的位;这里我面配置的是bit4~bit7,都配置成1 1 1 1
CSn1 是什么?是DM9000接在内存的什么地方。这里接的是BANk1
寄存器 SROM_BC1
没啥好说的
修改配置文件里跟DM9000相关的信息
#define CONFIG_DM9000_BASE (0x88000300)
一开始我们设置的是0x88000000,但是在调试的时候网卡没有启动成功。
为什么是0x8800呢,因为DM9000接在bank1上,bank1 的起始地址就是0x88000000。
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
查看我们的CMD引脚,接在了ADDR2;所以我们就加上4(0b100)对应第2位。
第八个问题 移植完了启动不了内核
大致有可能是这几个问题
机器码
如果说机器码和内核里边的机器码对不上,就会启动不起来。![请添加图片描述](https://img-blog.csdnimg.cn/63ccfe6feb1649f7adbf40f55db42ca5.png)
串口
如果说,当我们启动内核后看不到信息,有可能是内核里的串口和uboot中的串口不一致,导致信息输出到了另一个串口上了。