从三星官方移植uboot
2017-05-01 15:56
281 查看
从三星官方移植uboot
一、移植总体步骤
1、前提安装正确的交叉编译工具链,在Makefile中可查看。
2、配置使用:make smdkv210single_config,此宏定义所在目录为
/include/configs/smdkv210single.h
3、配置完后,make distclean make smdkv210single_config make
到sd_fusing目录下,执行./sd_fusing.sh /dev/sdc进行烧录。
二、内存相关信息配置
在start.S中,屏蔽掉bl PMIC_InitIp,因为开发板中没有这个相关电源控制芯片。
版本信息的修改。在smdkv210single.h文件中修改 CONFIG_IDENT_STRING 宏定义。
时钟和DDR的配置移植。由于开发板的SOC也是三星S5PV210,所以时钟配置三星已经做好了,不改动,时钟部分的代码在lowlevel_init.S中的bl system_clock_init函数中。查看内存相关配置信息命令:bdinfo
在smdkv210single.h文件中修改:
//#define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */
#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
//#define MEMORY_BASE_ADDRESS 0x20000000
#define MEMORY_BASE_ADDRESS 0x30000000
//#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE)
#define PHYS_SDRAM_2 0x40000000 //为了安全起见而修改
//#define DMC0_MEMCONFIG_0 0x20E01323
#define DMC0_MEMCONFIG_0 0x30F01323
由于硬件实际只有256M内存,所以映射虚拟地址时,要从0x30000000处开始,否则0x20000000和0x30000000被映射的地址重复了。所以要修改虚拟地址映射表的基地址。
在lowlevel_init.S (board\samsung\smdkc110)文件中,将.set __base,0x200修改为.set __base,0x300,此外还要修改smdkc110的函
4000
数
virt_to_phy_smdkc110(ulong addr)
//return (addr - 0xc0000000 + 0x20000000);
return (addr - 0xc0000000 + 0x30000000);
三、修改inand驱动问题
uboot启动后,出现unrecognised EXT_CSD structure version 7 的提示错误。此提示版本错误。解决办法:在MMC.C文件中将ext_csd_struct > 8(大于7就行)
ext_csd_struct = ext_csd[EXT_CSD_REV];
if (ext_csd_struct > 8) {
printf("unrecognised EXT_CSD structure "
"version %d\n", ext_csd_struct);
err = -1;
goto out;
}
四、串口的更改
uboot中默认使用串口2来做控制台输入输出的(S5Pv210共有4个串口)。三星移植的uboot和内核版本中以串口2默认为控制台输入输出。
初始化串口控制器的代码在lowlevel_init.S中的uart_asm_init中,其中初始化串口的寄存器用ELFIN_UART_CONSOLE_BASE宏作为串口n的寄存器的基地址,结合偏移量对寄存器进行寻址初始化。到底要初始化哪个串口,取决于ELFIN_UART_CONSOLE_BASE宏。这个宏的值又由CONFIG_SERIALn(n是从1到4)来决定。CONFIG_SERIAL 宏在include\configs目录下的Smdkc110h.h文件中。
ELFIN_UART_CONSOLE_BASE宏在include\S5pc110.h。
串口输出的SD checksum error。(这个是内部iROM打印出来的,内部iNand校验失败的信息)
五、修改网络地址设置
修改配置头文件smdkv210single.h,
/*define CONFIG_BOOTARGS"root=ramfsdevfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR192.168.0.20
#define CONFIG_SERVERIP192.168.0.10
#define CONFIG_GATEWAYIP 192.168.0.1
修改以上的几个相关宏定义就能修改相关的环境变量。
更改完成后如果环境变量还是原来的,正常。因为原来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))
六、修改行提示符
在Smdkv210single.h(include\configs)文件中,修改CFG_PROMPT宏定义,
#define CFG_PROMPT "MUSHAN210 # "
七、网卡驱动移植
SoC的SROM bank和网卡芯片的CS引脚(SROM就是SRAM/ROM)。SoC的SROMController其实就是SoC提供的对外总线式连接SRAM/ROM的接口。如果SoC要外部外接一些SRAM/ROM类的存储芯片就要通过SROM Controller来连接。网卡接在SROM中好处就是网卡芯片好像一个存储芯片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存器。网卡芯片内部寄存器使用相对地址访问,SoC访问网卡芯片00寄存器时的地址应该是:起始地址+00这里的起始地址就是网卡芯片对应接在SROM
bankn中的bankn对应的基地址。实际上也是一种总线式连接方式。优势是SoC内部不需要内置网卡控制器,所有的SFR全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像Nand/SD接口一样使用时序来访问。
网线有8根线,但是实际只有4根有效通信线,另外4根都是GND,用来抗干扰的。4根通信线中管发送的有2根(Tx-和Tx+),管接收的有2根(Rx+和Rx-)。因为网线上传输的是差分信号。
网卡芯片有个CS引脚,(CS就是chip select,片选信号,主机向CS发送有效信号则从机芯片工作,主机向CS发送无效信号则从机芯片不工作。),这个引脚要接主机SoC的片选信号引脚,主机S5PV210的每一个SROM bank中有一个片选信号CSn(n=0-5),从原理图可以看出,我们X210上将DM9000的CS引脚接到了CSn1上,对应SROM bank1(推断出DM9000的总线地址基地址是0x88000000)
实际测试时0x88000300才能用。
DM9000的CMD引脚接到了S5PV210的ADDR2引脚上。DM9000为了减少芯片引脚数,数据线和地址线是复用的(DATA0到DATA15这16根线是有时候做数据线传输数据,有时候做地址线传输地址的。什么时候做什么用就由CMD引脚决定。)通过查询数据手册知道:当CMD为高电平时对应传输是DATA,当CMD为低电平时对应传输为INDEX(offset,寄存器地址)
网卡芯片的驱动程序,在uboot/drivers/net/dm9000x.c和dm9000x.h。uboot在第二阶段init_sequences中进行了一系列的初始化,网卡初始化代码地方在:
start_armboot
init_sequence
board_init
dm9000_pre_init
#define DM9000_16BIT_DATA 这个宏用来表示DM9000工作在16位总线模式下。
CONFIG_DM9000_BASE是DM9000网卡通过SROM bank映射到SoC中地址空间中的地址。这个地址的值取决于硬件接到了哪个bank,这个bank的基地址是SoC自己定义好的。譬如我们这里接到了bank1上,bank1的基地址是0x88000000.
DM9000_IO表示访问芯片IO的基地址,直接就是CONFIG_DM9000_BASE;DM9000_DATA表示我们访问数据时的基地址,因为DM9000芯片的CMD引脚接到了ADDR2,因此这里要+4(0b100,对应ADDR2)
一、移植总体步骤
1、前提安装正确的交叉编译工具链,在Makefile中可查看。
2、配置使用:make smdkv210single_config,此宏定义所在目录为
/include/configs/smdkv210single.h
3、配置完后,make distclean make smdkv210single_config make
到sd_fusing目录下,执行./sd_fusing.sh /dev/sdc进行烧录。
二、内存相关信息配置
在start.S中,屏蔽掉bl PMIC_InitIp,因为开发板中没有这个相关电源控制芯片。
版本信息的修改。在smdkv210single.h文件中修改 CONFIG_IDENT_STRING 宏定义。
时钟和DDR的配置移植。由于开发板的SOC也是三星S5PV210,所以时钟配置三星已经做好了,不改动,时钟部分的代码在lowlevel_init.S中的bl system_clock_init函数中。查看内存相关配置信息命令:bdinfo
在smdkv210single.h文件中修改:
//#define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */
#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
//#define MEMORY_BASE_ADDRESS 0x20000000
#define MEMORY_BASE_ADDRESS 0x30000000
//#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE)
#define PHYS_SDRAM_2 0x40000000 //为了安全起见而修改
//#define DMC0_MEMCONFIG_0 0x20E01323
#define DMC0_MEMCONFIG_0 0x30F01323
由于硬件实际只有256M内存,所以映射虚拟地址时,要从0x30000000处开始,否则0x20000000和0x30000000被映射的地址重复了。所以要修改虚拟地址映射表的基地址。
在lowlevel_init.S (board\samsung\smdkc110)文件中,将.set __base,0x200修改为.set __base,0x300,此外还要修改smdkc110的函
4000
数
virt_to_phy_smdkc110(ulong addr)
//return (addr - 0xc0000000 + 0x20000000);
return (addr - 0xc0000000 + 0x30000000);
三、修改inand驱动问题
uboot启动后,出现unrecognised EXT_CSD structure version 7 的提示错误。此提示版本错误。解决办法:在MMC.C文件中将ext_csd_struct > 8(大于7就行)
ext_csd_struct = ext_csd[EXT_CSD_REV];
if (ext_csd_struct > 8) {
printf("unrecognised EXT_CSD structure "
"version %d\n", ext_csd_struct);
err = -1;
goto out;
}
四、串口的更改
uboot中默认使用串口2来做控制台输入输出的(S5Pv210共有4个串口)。三星移植的uboot和内核版本中以串口2默认为控制台输入输出。
初始化串口控制器的代码在lowlevel_init.S中的uart_asm_init中,其中初始化串口的寄存器用ELFIN_UART_CONSOLE_BASE宏作为串口n的寄存器的基地址,结合偏移量对寄存器进行寻址初始化。到底要初始化哪个串口,取决于ELFIN_UART_CONSOLE_BASE宏。这个宏的值又由CONFIG_SERIALn(n是从1到4)来决定。CONFIG_SERIAL 宏在include\configs目录下的Smdkc110h.h文件中。
ELFIN_UART_CONSOLE_BASE宏在include\S5pc110.h。
串口输出的SD checksum error。(这个是内部iROM打印出来的,内部iNand校验失败的信息)
五、修改网络地址设置
修改配置头文件smdkv210single.h,
/*define CONFIG_BOOTARGS"root=ramfsdevfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR192.168.0.20
#define CONFIG_SERVERIP192.168.0.10
#define CONFIG_GATEWAYIP 192.168.0.1
修改以上的几个相关宏定义就能修改相关的环境变量。
更改完成后如果环境变量还是原来的,正常。因为原来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))
六、修改行提示符
在Smdkv210single.h(include\configs)文件中,修改CFG_PROMPT宏定义,
#define CFG_PROMPT "MUSHAN210 # "
七、网卡驱动移植
SoC的SROM bank和网卡芯片的CS引脚(SROM就是SRAM/ROM)。SoC的SROMController其实就是SoC提供的对外总线式连接SRAM/ROM的接口。如果SoC要外部外接一些SRAM/ROM类的存储芯片就要通过SROM Controller来连接。网卡接在SROM中好处就是网卡芯片好像一个存储芯片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存器。网卡芯片内部寄存器使用相对地址访问,SoC访问网卡芯片00寄存器时的地址应该是:起始地址+00这里的起始地址就是网卡芯片对应接在SROM
bankn中的bankn对应的基地址。实际上也是一种总线式连接方式。优势是SoC内部不需要内置网卡控制器,所有的SFR全都在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像Nand/SD接口一样使用时序来访问。
网线有8根线,但是实际只有4根有效通信线,另外4根都是GND,用来抗干扰的。4根通信线中管发送的有2根(Tx-和Tx+),管接收的有2根(Rx+和Rx-)。因为网线上传输的是差分信号。
网卡芯片有个CS引脚,(CS就是chip select,片选信号,主机向CS发送有效信号则从机芯片工作,主机向CS发送无效信号则从机芯片不工作。),这个引脚要接主机SoC的片选信号引脚,主机S5PV210的每一个SROM bank中有一个片选信号CSn(n=0-5),从原理图可以看出,我们X210上将DM9000的CS引脚接到了CSn1上,对应SROM bank1(推断出DM9000的总线地址基地址是0x88000000)
实际测试时0x88000300才能用。
DM9000的CMD引脚接到了S5PV210的ADDR2引脚上。DM9000为了减少芯片引脚数,数据线和地址线是复用的(DATA0到DATA15这16根线是有时候做数据线传输数据,有时候做地址线传输地址的。什么时候做什么用就由CMD引脚决定。)通过查询数据手册知道:当CMD为高电平时对应传输是DATA,当CMD为低电平时对应传输为INDEX(offset,寄存器地址)
网卡芯片的驱动程序,在uboot/drivers/net/dm9000x.c和dm9000x.h。uboot在第二阶段init_sequences中进行了一系列的初始化,网卡初始化代码地方在:
start_armboot
init_sequence
board_init
dm9000_pre_init
#define DM9000_16BIT_DATA 这个宏用来表示DM9000工作在16位总线模式下。
CONFIG_DM9000_BASE是DM9000网卡通过SROM bank映射到SoC中地址空间中的地址。这个地址的值取决于硬件接到了哪个bank,这个bank的基地址是SoC自己定义好的。譬如我们这里接到了bank1上,bank1的基地址是0x88000000.
DM9000_IO表示访问芯片IO的基地址,直接就是CONFIG_DM9000_BASE;DM9000_DATA表示我们访问数据时的基地址,因为DM9000芯片的CMD引脚接到了ADDR2,因此这里要+4(0b100,对应ADDR2)
相关文章推荐
- 嵌入式linux开发uboot移植(七)——三星官方uboot的移植
- uboot移植(八)——移植三星官方uboot(二)
- S5PV210-uboot移植-从三星官方uboot开始移植
- uboot移植——使用三星官方的uboot进行移植
- uboot移植-从三星官方源码开始移植过程总结
- 嵌入式linux开发uboot移植(七)——三星官方uboot的移植
- uboot移植(九)——移植三星官方uboot(三)
- 移植官方uboot到GEC210开发板
- 三星官方uboot移植实战1
- uboot移植(七)——移植三星官方uboot(一)
- 在s5pv210开发板上移植官方2101310版本的uboot
- kernel移植——从三星官方内核开始移植
- 从官方源码移植uboot(Exynos4412)
- 朱有鹏老师课堂笔记,从uboot官方移植到s5pv210上(二)
- uboot的移植2-从uboot官方标准uboot开始移植
- S5PV210-uboot移植-从uboot官方的uboot进行移植
- uboot移植——使用官方uboot进行移植
- uboot移植-从uboot官方源码开始移植过程总结
- 2.12.uboot的移植2-从uboot官方标准uboot开始移植
- S5PV210-kernel-从三星官方的内核开始移植