您的位置:首页 > 其它

uboot移植

2016-08-16 11:07 246 查看
1.windows共享文件夹里 下载、解压三星官方uboot源码





2.复制到linux下的目录





3.在共享文件夹里面建立 SourceInsight 工程

3.1 修改start.S文件 开发板并没有电源管理模块



3.2 时钟和DDR的配置移植

3.2.1 确认时钟部分的配置

(1)时钟部分的运行结果本来就是对的,时钟部分的代码在lowlevel_init.S中的bl system_clock_init调用的这个函数中。函数的代码部分是没任何问题的,根本不需要改动,要改动的是寄存器写入的值,这些值都在配置头文件(smdkv210single.h)中用宏定义定义出来了。如果时钟部分要更改,关键是去更改头文件中的宏定义。

(2)三星移植时已经把210常用的各种时钟配置全都计算好用宏开关来控制了。只要打开相应的宏开关就能将系统配置为各种不同的频率。

3.2.2  DDR配置信息的更改 (smdkv210single.h)

(1)从运行信息以及bdinfo命令看到的结果,显示DRAM bank0和1的size值都设置错了。

(2)使用md和mw命令测试内存,发现20000000和40000000开头的内存都是可以用的,说明代码中DDR初始化部分是正确的,只是size错了。

(3)内存部分配置成:



#define CONFIG_NR_DRAM_BANKS    2          /* we have 2 bank of DRAM */

//#define SDRAM_BANK_SIZE         0x20000000    /* 512 MB */

#define SDRAM_BANK_SIZE         0x10000000    /* 256 MB */

#define PHYS_SDRAM_1            MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */

#define PHYS_SDRAM_1_SIZE       SDRAM_BANK_SIZE

//#define PHYS_SDRAM_2            (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */

#define PHYS_SDRAM_2   0x40000000

#define PHYS_SDRAM_2_SIZE       SDRAM_BANK_SIZE


3.2.3 DDR地址另外配置(smdkv210single.h)

(1)目标:将DDR端口0地址配置为30000000开头 

更改有2个目的:第一是让大家体验内存配置的更改过程;第二是3开头的地址和DRAM bank1上40000000开头的地址就连起来了。这样我们就得到了地址连续的512MB内存,而原来我们得到的512MB内存地址是断续的。

(2)根据裸机中讲DDR初始化部分的课程,和uboot前面分析uboot中DDR初始化部分的代码的课程,得出结论就是:DDR的初始化代码部分是在lowlevel_init.S中写的,是不动的。代码部分就是对相应寄存器做相应值的初始化;要动的是值,而uboot为了具有可移植性把值都宏定义在include/configs/xxx.h中了。因此我们只需要去这个配置头文件中更改配置值即可。

更改内容是:#define DMC0_MEMCONFIG_0 0x20E01323改为:
 #define DMC0_MEMCONFIG_0
0x30F01323 //注意20改为30 、 E改为F 。


3.2.4 smdkv210single.h中相关宏定义修改

(1)寄存器的值改了后相当于是硬件配置部分做了更改。但是uboot中DDR相关的一些软件配置值还没更改,还在原来位置,所以要去更改。

(2)#define MEMORY_BASE_ADDRESS 0x20000000改为:
#define MEMORY_BASE_ADDRESS
0x30000000


3.2.5 虚拟地址映射表中相应修改

(1)uboot中开启了MMU对内存进行了段式映射,有一张内存映射表。之前课程中分析过,分析方法是一样的。

(2)经过实际分析,发现这个内存映射只是把20000000开始的256MB映射到C0000000开头的256MB。我们更改方法是将2改成3.

(3)为了安全起见,再去配置头文件smdkv210single.h中查一遍,看看有没有其他的宏定义值和内存配置有关联的。

//后面还有修改

(1)修改 lowlevel_init.S  中的 。set_base ,0x200  改为0x300

(2)修改uboot/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110,将其中的20000000改为30000000即可。


(3)修改uboot/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110,将其中的20000000改为30000000即可。

4. 同步改过的文件到 linux 中

4.1 sshsecureshell
http://www.cnblogs.com/mliudong/p/4094519.html http://blog.sina.com.cn/s/blog_5f435c130102v6pv.html
4.2 脚本



5.  重新配置编译,烧录运行查看结果。

uboot/sd_fusing目录下有sd_fusing.sh脚本,用来烧录



6.inand驱动问题的解决(driver/mmc/mmc.c)

(1)初步的解决方案是自己先浏览一遍这个问题点周边代码上下文。通过浏览代码上下文,发现这个函数是在读取SD/iNand的ext_csd寄存器的值。通过浏览代码结合出错地方,可以判断出:从卡端读取ext_csd寄存器是成功的,并且从读取结果中拿到了卡的版本号信息。然后代码对版本号进行了判断,并且如果版本号大于5就会报错并且函数错误退出。这就是问题所正。

(2)问题就是:我们使用的iNand卡的版本号大于5,而uboot代码本身不处理版本号大于5的卡,因此出错了。

(3)解决方法就是修改uboot中的代码,把判断的5改成更大ls的数字。譬如8,然后跳过这个错误。







7.一些小问题的修补

7.1、控制台串口更换为串口0

//修改串口 smdkc110.h 文件

#define CONFIG_SERIAL2          1 /* we use UART2 on SMDKC110 */

7.2 修改默认网络地址设置

(1)修改配置头文件smdkv210single.h中的CONFIG_IPADDR等宏,则可以修改uboot的默认环境变量。

(2)更改完成后如果环境变量还是原来的,正常。因为原来uboot执行过saveenv,因此环境变量已经被保存到iNand中的ENV分区中去了。uboot启动后校验时iNand的ENV分区中的环境变量是正确的,因此会优先加载。我们在uboot源代码中修改的只是默认的环境变量。解决方案是擦除掉iNand中的那一份环境变量,然后迫使uboot启动时使用uboot代码中自带的默认的这一份环境变量,就可以看到了。

(3)可以使用mmc write 0 30000000 11# 32(表示将DDR的0x30000000开头的一段内存中的内容写入iNand中的第17个扇区开始的32个扇区内,写入长度是32个扇区长度(16KB))

8.网卡移植代码实践
http://blog.csdn.net/qq_26602023/article/details/52069242
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  u-boot 移植