您的位置:首页 > 运维架构 > Linux

朱有鹏老师课堂笔记,从uboot官方移植到s5pv210上(二)

2016-12-14 10:21 288 查看
Board_init_f中调用:sequence
 
1.banner信息补全:init_fnc_t *init_sequence[]
中 display_banner
在配置文件中加CONFIG_IDENT_STRING
宏定义,
2.#define CFG_PROMPT    "x210 # "配置文件中,uboot命令行提示符
3.int print_cpuinfo(void) 显示时钟信息。
注释掉原有函数内容,复制修改printf("\nCPU:  S5PV210@%ldMHz(ok)\n", get_ARMCLK()/1000000);
get_ARMCLK():需要修改成来的,需要移植时钟初始化
(1)在lowlevel_init.S中移植system_clock_init函数,并且在s5p_goni.h中添加相关的宏
定义参数,然后在lowlevel_init函数中调用system_clock_init函数。
 
board和DDR配置显示移植
board名称更改
2DDR配置值修改
MACH_TYPE定义
DDR打印信息更改
进入board.c
checkboard--->goni.c中int checkboard(void)改board名
dram_init--->goni.c中int dram_init(void)删掉PHYS_SDRAM_3_SIZE,并在gon.h文件中修改
dram_init_banksize中修改
int board_init(void) 改机器码
 
 board_init_r中:
1.选择MMC/SD模式:注释掉配置文件的关于默认onenand的宏,添加开启关于MMC的宏CONFIG_GENERIC_MMC
2.goni文件夹中Makefile中去掉onenand.c依赖
3.根据报错内容具体修改,至此,显示MMC:但是有错误,需进行sd/mmc移植
 
移植sd卡驱动
1.分析两个版本的uboot中SD卡驱动差异
(1)uboot2013.10中:驱动相关的文件主要有:
drivers/mmc/mmc.c
drivers/mmc/sdhci.c
drivers/mmc/s5p_sdhci.c
board/samsung/goni/goni.c
(2)三星移植版本中,驱动相关的文件主要有:
drivers/mmc/mmc.c
drivers/mmc/s3c_hsmmc.c
cpu/s5pc11x/cpu.c
cpu/s5pc11x/setup_hsmmc.c
(3)经过分析发现:SD卡驱动要工作要包含2部分内容,一部分是drivers/mmc目录下的是驱动,另外一部分是uboot自己提供的初始化代码(譬如GPIO初始化、时钟初始化)
2、复制必要的文件并修改相应Makefile
(1)首先解决drivers/mmc目录下的文件替换。cpu/s5pc11x/setup_hsmmc.c放
在goni文件夹中,并Makefile添加依赖;cpu/s5pc11x/cpu.c待会进行部分移

(2)board_mmc_init或者cpu_mmc_init任选一个即可
 
 
弱名称,如果没有这个函数则讲  __def_mmc_init
命名为前面的,返回-1;新建一个 board._mmc_init
调用初始化函数
(3)替换头文件:mmc.h;s3c_hsmmc.h;(setup_hsmmc.c放在goni文件夹中
Makefile中添加setup_hsmmc.o文件)
注意SI工具的同步。
(4)修改初始化代码。确保函数执行路线
(5)编译,根据报错信息修改添加配置头文件
cmd_mm.c替换。(驱动文件换了对应的头文件,命令文件也要替换)
mmc_write.c 所在文件中的Makefile中注释掉,新的mmc.c不需要
Goni.c 和setup_hsmmc.c,注释regs.h头,包含s
d1fa
5p110.h,
setup_hsmmc.c也要包含<sam/arch/clck.h>.
 
若编译并烧录完成,在uboot命令行下,用mmc,md等命令测试。
 
环境变量配置移植
(1)目前情况是uboot在SD2中,而ENV在SD0中,所以现在ENV不管放在哪个扇区都能工作,不会有问题。但是我们还是得找到ENV分区所在并且改到不会和uboot冲突,因为将来部署系统时我们会将uboot和kernel、rootfs等都烧录到iNnand中去,那时候也要确保不会冲突。
(2)static inline int write_env(struct mmc *mmc, unsigned long size,
    unsigned long offset, const void *buffer)
类似于这种函数,在代码分析中,关键是弄明白各种参数的意义。mmc表示要写的mmc设备,size表示要写的大小,offset表示要写到SD卡的哪个扇区去,buffer是要写的内容。
(3)CONFIG_ENV_OFFSET这个宏决定了我们的ENV在SD卡中相对SD卡扇区0的偏移量,也就是ENV写到SD卡的哪里去了。经过分析发现这个宏的值为0.所以我们的ENV
被写到了0扇区开始的32个扇区中。
(4)写到这里肯定不行,因为和uboot的BL1冲突了。解决方案是改变这个CONFIG_ENV_OFFSET的值,将ENV写到别的空闲扇区去。
(5)#define MOVI_BL2_POS ((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)
后面这三个其实分别是1+16+32=49
其中的1就是扇区0(空闲的),16是就是扇区1-16(uboot的BL1),32就是扇区17-48(存放ENV的),49自然就是uboot的BL2开始扇区了。这种安排是三星移植的uboot版本中推荐的SD卡的分区方式,不一定是唯一的。
(6)我们参考这个设计,即可实现环境变量不冲突。所以只要将ENV放到17扇区起始的地方即可
CONFIG_ENV_OFFSET  是什么单位。扇区还是字节等
 
测试环境变量的保存是否正确
 


(1)程序修改重新编译后启动,启动后要注意iNand中本来有没有环境变量。为了保险起见对iNand的前49个扇区进行擦除,然后就可以确保里面没有之前保存过的环境变量了。使用命令:mmc
write 0 30000000 0# 49来擦除SD0的扇区0-48,保证以前的环境变量都没有了。
(2)重新开机后先set随便改一个环境变量作为标记然后saveenv然后重启。
(3)测试方法是,使用:mmc read 0 30000000 17# 32命令将iNand的17开始的32个扇区读出来到内存30000000处,然后md查看。找到显示区域里面的各个环境变量,看读出来的和自己刚才修改的值是否一样。
 
常用环境变量的配置移植
(1)除掉用不要显示的环境变量,常用的环境变量就是网络相关的那几个,和CONFIG_BOOTCOMMAND、CONFIG_BOOTARGS等。
 
网卡驱动移植
1.查看代码发现,本uboot没有开启网卡,须在配置文件中开启     #define CONFIG_CMD_NET
2.顺便移植其他有关网卡的宏,防止以后用到
3.添加ping,tftp命令。do_ping ;do_tftp   发现ping命令开关宏为
CONFIG_CMD_PING,而tftp命令的开关为CONFIG_CMD_NET,确认添加
4.代码实践。结果是ping和tftp命令都被识别了,但是都提示no ethernet found`````
网络不通。为什么不通?因为还没做初始化等移植
5.开始CONFIG_CMD_NET后执行eth_initialize(gd->bd)
 


同mmc时一样新建board_eth_init函数调用dm9000x.c中的最后一个函数int
dm9000_initialize(bd_t *bis),这个函数就是用来注册dm9000网卡驱动的。新建
Int board_eth_init(bd_t *bis) 调用dm9000_initialize(bd_t *bis)
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
6.编译,并做相应修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uboot 移植 linux u-boot