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

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函数。

 

boardDDR配置显示移植

board名称更改

2DDR配置值修改

MACH_TYPE定义

DDR打印信息更改

进入board.c

checkboard--->goni.cint checkboard(void)board

dram_init--->goni.cint 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.分析两个版本的ubootSD卡驱动差异

(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头,包含s5p110.h setup_hsmmc.c也要包含<sam/arch/clck.h>.

 

若编译并烧录完成,在uboot命令行下,用mmcmd等命令测试。

 

环境变量配置移植

(1)目前情况是ubootSD2中,而ENVSD0中,所以现在ENV不管放在哪个扇区都能工作,不会有问题。但是我们还是得找到ENV分区所在并且改到不会和uboot冲突,因为将来部署系统时我们会将ubootkernelrootfs等都烧录到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这个宏决定了我们的ENVSD卡中相对SD卡扇区0的偏移量,也就是ENV写到SD卡的哪里去了。经过分析发现这个宏的值为0.所以我们的ENV

被写到了0扇区开始的32个扇区中。

(4)写到这里肯定不行,因为和ubootBL1冲突了。解决方案是改变这个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-16ubootBL1),32就是扇区17-48(存放ENV的),49自然就是ubootBL2开始扇区了。这种安排是三星移植的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命令将iNand17开始的32个扇区读出来到内存30000000处,然后md查看。找到显示区域里面的各个环境变量,看读出来的和自己刚才修改的值是否一样。

 

常用环境变量的配置移植

(1)除掉用不要显示的环境变量,常用的环境变量就是网络相关的那几个,和CONFIG_BOOTCOMMANDCONFIG_BOOTARGS等。

 

网卡驱动移植

1.查看代码发现,本uboot没有开启网卡,须在配置文件中开启     #define CONFIG_CMD_NET

2.顺便移植其他有关网卡的宏,防止以后用到

3.添加pingtftp命令。do_ping ;do_tftp   发现ping命令开关宏为 CONFIG_CMD_PING,而tftp命令的开关为CONFIG_CMD_NET,确认添加

4.代码实践。结果是pingtftp命令都被识别了,但是都提示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.编译,并做相应修改

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值