从三星官方移植uboot

从三星官方移植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的函数

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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值