uboot移植初体验 -- 三星官方uboot移植

​ 手边的开发板是S5PV210,下面进行对三星官方uboot的移植工作。

1、移植前准备工作

1.1、SSH环境搭建

​ 我为什么想要搭建openssh的环境?是因为我想要在Windows环境下看代码并且改代码,所以需要此文件用来同步我Windows下和Linux下的代码,用这样的工具可以很方便的完成我的需求,提高我的效率。

1.1.1、安装ssh-server

​ 在命令行执行sudo apt-get install openssh-server命令即可安装,安装成功如下图所示。

uboot移植初体验 -- 三星官方uboot移植_第1张图片

1.1.2、用SSH连接Linux虚拟机

​ 连接时出现以下错误信息,推断是Ubuntu的防火墙使Windows下的这个软件找不到其主机的ip地址。接着在Windows的cmd命令行下去ping我的Ubuntu虚拟机的ip地址,发现无法ping通。

uboot移植初体验 -- 三星官方uboot移植_第2张图片

​ 下面是我使用sudo ufw disable命令来禁用Ubuntu的防火墙,命令和现象如下。
在这里插入图片描述

​ 在Windows可以ping通Ubuntu的情况下,出现server responded "algorithm negotiation failed”的错误。如下图。
uboot移植初体验 -- 三星官方uboot移植_第3张图片

​ 经过检查之后,发现我的虚拟机的ssh服务没有开启,下面进行SSH服务器的开启。

(1)首先检查ssh-server是否安装成功。在root模式下输入apt-get install openssh-server openssh-client,可以看出已经安装成功。

uboot移植初体验 -- 三星官方uboot移植_第4张图片

(2)输入命令vi /etc/ssh/ssh_config打开客户端配置文件进行修改,修改后的内容如下图所示。使用22端口,Protocol 2规则,并且打开密钥认证。

在这里插入图片描述

(3)复制Ciphers…那两行话,然后退出文件,输入命令vi /etc/ssh/sshd_config修改服务器端的配置文件,再将复制的内容粘贴到文件中即可。

(4)退出之后在命令行输入service sshd restart来重启我们的SSH服务器。

​ 开启了之后,发现仍出现同样的错误提示,查阅了相关资料找到了一种方法,在配置文件sshd_config中添加如下代码,保存退出后使用/etc/init.d/ssh restart命令对SSH进行重启即可。

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc
MACs hmac-md5,hmac-sha1,[email protected],hmac-ripemd160,hmac-sha1-96,hmac-md5-96
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,[email protected]

在这里插入图片描述

此方法借鉴了其他博主的方法,原文链接是:https://blog.csdn.net/houchaoqun_xmu/article/details/70038253,在此感谢此博主!

​ 下图是用Windows下的SHH成功连接Linux虚拟机的图样。

uboot移植初体验 -- 三星官方uboot移植_第5张图片

1.1.3、用SecureCRT连接虚拟机

​ 首先出现了下图所示的错误提示,即SecureCRT连接Linux虚拟机超时,同样推断是Ubuntu的防火墙导致Windows无法连接Ubuntu。

uboot移植初体验 -- 三星官方uboot移植_第6张图片

​ 但是禁用了防火墙之后连接出现下图所示的错误。

uboot移植初体验 -- 三星官方uboot移植_第7张图片

​ 同样进行了1.1.2中的开启SSH服务的(1)到(4)的操作之后输入我的口令,出现口令验证失败的提示,如下图所示。
uboot移植初体验 -- 三星官方uboot移植_第8张图片

​ 反复确认密码正确之后,发现配置文件中的配置错误,导致Ubuntu拒绝root用户SSH远程登陆。解决方法是更改配置文件,输入vi /etc/ssh/sshd_config进入配置文件,做了如下更改,即可成功登录。

在这里插入图片描述
​ 下图是成功使用SecureCRT登录Linux虚拟机的内容。

uboot移植初体验 -- 三星官方uboot移植_第9张图片

1.2、检查交叉编译工具链

​ 首先将我们的uboot拷贝到Linux系统文件夹下,然后在主Makefile中查看使用的交叉编译工具链是否被我们安装,安装的是否是正确的。经检查,我的交叉编译工具链路径和内容都正确。

1591356048030
uboot移植初体验 -- 三星官方uboot移植_第10张图片

1.3、配置并先进行一次测试

​ 我使用这个配置来对uboot进行配置并且烧录测试查看现象,现象是串口没有输出,但是开发板供电锁存成功。
在这里插入图片描述

2、分析并修改源码1

2.1、第一次测试现象分析

​ 从start.S开始分析,开发板供电锁存成功说明到开发板供电锁存的代码都可以正常运行,分析后面的代码,发现后面直到bl lowlevel_init都可以运行,下面跳转到lowlevel_init.S中进行代码分析,lowlevel_init.S中也有供电锁存的代码,所以对其后面的代码进行分析,因为uart_asm_init函数如果成功运行会打印’O’的字样,但是没有输出就说明出现问题的地方在lowlevel_init.S供电锁存的操作到uart_asm_init函数之间。下面分析它们之间的代码。

	ldr	r0, =0xff000fff
	bic	r1, pc, r0		/* r0 <- current base addr of code */
	ldr	r2, _TEXT_BASE		/* r1 <- original base addr in ram */
	bic	r2, r2, r0		/* r0 <- current base addr of code */
	cmp     r1, r2                  /* compare r0, r1                  */
	beq     1f			/* r0 == r1 then skip sdram init   */

	/* init PMIC chip */
	bl PMIC_InitIp

	/* init system clock */
	bl system_clock_init

	/* Memory initialize */
	bl mem_ctrl_asm_init

​ 可以明显看出前6行也不会有什么问题,下面对可能有问题的函数一一进行分析。

2.1.1、PMIC_InitIp

​ 经过判断,此开发板并未用PMIC来管理电源模块,没有收到PMIC收到的反馈从而不执行下面的代码,在此调用PMIC_InitIp函数会造成死循环,屏蔽这里的函数调用即可。

在这里插入图片描述

​ 屏蔽之后再次进行配置编译烧录,并且查看现象。

uboot移植初体验 -- 三星官方uboot移植_第11张图片

​ uboot可以运行,但是DRAM显示大小不对,SD/MMC未初始化成功。

2.1.2、system_clock_init

​ 上方uboot可以运行就说明时钟初始化没有问题,所以不做过多分析修改,如果要修改时钟频率,在配置文件smdkv210single.h中修改即可。

2.1.3、mem_ctrl_asm_init

​ 分析之前,首先使用bdinfo命令查看错误信息出现的原因,发现DRAM的bank以及size设置错误。再使用md命令对内存进行操作,可以正常进行,说明DRAM初始化没有问题。

uboot移植初体验 -- 三星官方uboot移植_第12张图片

​ 因为我使用的是smdkv210single_config的配置,所以在u-boot-samsung-dev/include/configs/smdkv210single.h中做相应的修改即可。首先修改DMC端口0的起始地址,将其改为从0x30000000开头,再将第一块内存和第二块内存的起始地址做相应修改,然后改size,即修改SDRAM_BANK_SIZE宏定义为我们开发板使用的内存容量,我们的修改内容如下。

1591415914227.png

在这里插入图片描述

uboot移植初体验 -- 三星官方uboot移植_第13张图片

​ 与此同时,也要对MMU中虚拟映射表的内存映射进行相应修改,查阅数据手册来得知需要将数据修改成什么样,在start.S中定位虚拟映射表的位置_mmu_table_base,追寻到MMU虚拟映射表所在的文件中(u-boot-samsung-dev/board/samsung/smdkc110/lowlevel_init.S)中进行相应修改,将0xc0000000-0xd0000000映射到物理内存0x30000000-0x40000000,修改内容如下。
uboot移植初体验 -- 三星官方uboot移植_第14张图片

​ 修改完毕之后再次烧录运行查看现象。发现我们的DRAM容量显示正确了,但是SD/MMC后就无打印信息了,说明第一阶段成功运行,再次定位错误位置在第二阶段。
uboot移植初体验 -- 三星官方uboot移植_第15张图片

2.2、第二次测试现象分析

2.2.1、错误定位

​ 第二阶段在u-boot-samsung-dev/lib_arm/board.c中,发现mmc_initialize函数之前打印信息正常,但是没有运行此函数。因为第二阶段是在DRAM中运行的,说明DRAM的初始化没问题,推测是虚拟地址映射错误导致下面的初始化代码没有运行在正确的内存中,再进一步对错误进行定位。

​ 首先查找配置文件中虚拟地址转为物理地址的部分,发现使用了virt_to_phy_smdkc110函数。

#ifdef CONFIG_ENABLE_MMU
#define virt_to_phys(x)	virt_to_phy_smdkc110(x)
#else
#define virt_to_phys(x)	(x)
#endif

​ 再进入u-boot-samsung-dev/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110函数发现问题,内存映射转换错误,将红色方框标记的内容改成0x30000000即可。
uboot移植初体验 -- 三星官方uboot移植_第16张图片

2.2.2、再次进行测试

​ 在修改完错误内容之后进行烧录测试,看到在SD/MMC的初始化中出现错误,其他现象正常,于是进行之后对SD/MMC初始化方面的分析。

uboot移植初体验 -- 三星官方uboot移植_第17张图片

3、分析并修改源码2

3.1、SD/MMC初始化

​ 搜索错误打印信息中的“EXT_CSD”在Source Insight中搜索相关代码从而定位错误打印信息在根目录下drivers/mmc/mmc.c的第181行。下面对这行代码所在的函数mmc_read_ext_csd进行分析。推断错误可能是卡的版本号在读取过程中读取版本大于5,在此我将5修改为7,用来跳出这个错误,修改内容如下。
uboot移植初体验 -- 三星官方uboot移植_第18张图片

​ 再次运行发现SD/MMC后面出现了正常的数据。

uboot移植初体验 -- 三星官方uboot移植_第19张图片

3.2、修改默认网络地址

​ 在此我想修改我的默认网络的环境变量,从而方便以后使用,所以我在配置文件smdkv210single.h中修改相应的值,修改内容如下。

uboot移植初体验 -- 三星官方uboot移植_第20张图片

4、网卡驱动移植

4.1、DM9000网卡驱动的移植

​ 在我们的根目录下的drivers/net中有dm9000x.c和dm9000x.h,用这两个DM9000网卡芯片驱动程序来进行移植。如果要移植,首先要根据数据手册以及原理图硬件接法来对网卡初始化函数部分进行修改,而网卡的初始化在uboot的第二阶段,也就是start_armboot中,我定位了它的位置在根目录下的board/samsung/smdkc110/smdkc110.c中。在board_init调用dm9000_pre_init函数对其进行初始化。因为我所用的开发板使用的是bank1上的接口,根据数据手册从而对代码进行修改,下面是它的源代码部分以及修改内容。

static void dm9000_pre_init(void)
{
	unsigned int tmp;

#if defined(DM9000_16BIT_DATA)
//	SROM_BW_REG &= ~(0xf << 20);
//	SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20);
	SROM_BW_REG &= ~(0xf << 4);		//这两行是修改部分
	SROM_BW_REG |= (1<<7) | (1<<6) | (1<<5) | (1<<4);
#else	
	SROM_BW_REG &= ~(0xf << 20);
	SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);
#endif
//	SROM_BC5_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
	SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));	//修改部分

	tmp = MP01CON_REG;
//	tmp &=~(0xf<<20);
//	tmp |=(2<<20);
    tmp &=~(0xf<<4);	//这两行是修改部分
    tmp |=(2<<4);
    
	MP01CON_REG = tmp;
}

​ 同样配置文件smdkv210single.h中也需要对DM9000相关的数据进行修改,修改内容如下。

uboot移植初体验 -- 三星官方uboot移植_第21张图片

​ 经过测试,网卡驱动移植成功,效果图如下。
uboot移植初体验 -- 三星官方uboot移植_第22张图片

最后使用uboot启动内核,启动成功,三星官方uboot移植成功。

​ 同样配置文件smdkv210single.h中也需要对DM9000相关的数据进行修改,修改内容如下。

uboot移植初体验 -- 三星官方uboot移植_第23张图片

​ 经过测试,网卡驱动移植成功,效果图如下。

uboot移植初体验 -- 三星官方uboot移植_第24张图片

最后使用uboot启动内核,启动成功,三星官方uboot移植成功。

uboot移植初体验 -- 三星官方uboot移植_第25张图片

你可能感兴趣的:(Linux内核,uboot移植)