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