移植前的准备

下载 android_uboot_smdkv210.tar.bz2 这个文件

开始移植

本人使用的开发板是九鼎的 x210,在三星 uboot 的主 Makefile 中找到了类似的 smdkv210 的相关配置,因为这些配置都差不多,就随便选择了 smdkv210single_config
在 make smdkv210single_config; make 执行之后进行 SD 卡烧录
在烧录后发现,串口没有信息输出,但是开发板供电锁存成功
开发板供电锁存是在 lowlevel_init.S 中进行的
可以判定 lowlevel_init.S 中有问题,需要进行修改

启动第一阶段

在 lowlevel_init.S 中发现了一段代码对开发板上不存在的 PMIC 的初始化,在注释后串口成功打印 ‘OK’

 /* init PMIC chip */
// bl PMIC_InitIp

uboot 开始进入启动第二阶段,通过串口输出信息可以看出,虽然 uboot 启动成功,但是很多配置信息是错误的

时钟配置

系统时钟是通过 lowlevel_init.S 中的 system_clock_init 进行的
由于三星在移植 uboot 时已经设置好系统时钟了,相关的时钟配置也都以宏的方式定义在 smdkv210single.h 文件中了
所以时钟这一块不用自己操心

ddr 配置

在 uboot 启动信息中发现串口输出的信息中,DRAM 大小和开发板的不符合

 DRAM:     G

在 smdkv210single.h 文件中找到 ddr 的相关的配置(471)
将 ddr 的地址更改为 0x30000000 (改了可以让两个 ddr 的地址连续),更改 ddr 的大小

 #define CONFIG_NR_DRAM_BANKS    2          /* we have 2 bank of DRAM */
//#define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */
#define SDRAM_BANK_SIZE 0x10000000 /* 256MB */
#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
#define MEMORY_BASE_ADDRESS 0x30000000 (71)

然后是修改 ddr 的初始化参数(smdkv210single.h   411)

 // #define DMC0_MEMCONFIG_0 0x20E01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC0_MEMCONFIG_0 0x30F01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed

ddr 的相关寄存器配置可以参考 S5PV210_UM_REV1.1.pdf

从图中可以看到,

[31:24] 控制 AXI 基地址,因为我们设置 ddr 的基地址为 0x30000000 ,所以这里设置为 0x30。

[23:16] 控制 AXI 基地址掩码,置1时有效,可以使基地址范围变为 0x3000_0000 ~ 0x37FF_FFFF,所以这里设置为 0xF0

修改虚拟地址到物理地址的映射
修改 board/samsung/smdkc110/smdkc110.c 的 virt_to_phy_smdkc110 函数  (187)

 ulong virt_to_phy_smdkc110(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xd0000000))
// return (addr - 0xc0000000 + 0x20000000);
return (addr - 0xc0000000 + 0x30000000);
...
}

(smdkv210single.h   522)

 #ifdef CONFIG_ENABLE_MMU
#define CFG_UBOOT_BASE 0xc3e00000
#else
#define CFG_UBOOT_BASE 0x33e00000
#endif

SD/MMC 配置
在 uboot 打印信息中看不到 SD/MMC 的大小,报下面的错误

 unrecognised EXT_CSD structure version 

通过报错信息的搜索,可以将问题定位到 drivers/mmc/mmc.c 中  (817)

 if (ext_csd_struct > ) {
printf("unrecognised EXT_CSD structure "
"version %d\n", ext_csd_struct);
err = -;
goto out;
}

将原先的判断 version 的版本改大点就可以了

控制台串口更换为串口0  (smdkv210single.h   148)

 #define CONFIG_SERIAL3          1    /* we use UART2 on SMDKC110 */
//#define CONFIG_SERIAL1 1 /* we use UART0 on SMDKC110 */

修改默认网络地址设置  (smdkv210single.h   216)

 #define CONFIG_ETHADDR        00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.20
#define CONFIG_SERVERIP 192.168.1.141
#define CONFIG_GATEWAYIP 192.168.1.1

使用mmc write 0 30000000 11# 32

 

修改行提示符  (smdkv210single.h   249)

 #define CFG_PROMPT              "ZYJ210 # "   /* Monitor Command Prompt       */

网卡芯片配置

开发板使用的网卡芯片为 DM9000 ,通过总线结构与开发板 SOC 相连,通过 SOC 的 SROM 控制器进行控制
这样的好处是可以直接通过地址访问网卡芯片内部的寄存器。访问方式是通过网卡芯片的基地址加上网卡芯片内部寄存器的偏移地址完成的


通过原理图观察可以知道 DM9000 与 SOC 之间通信的总线是 16 位的。 DM9000 的 CMD 引脚接到了 SOC 的 ADDR2 上, DM9000 数据命令总线复用,通过 CMD 进行判断是数据还是命令
CS 片选引脚接到了 SOC 的 CSn1 上,代表者使用的是 SROM bank1,因此 DM9000 的总线基地址为 0x88000000
我们需要做的配置也就是初始化网卡而已,驱动都是统一的

定位到板级初始化代码 board/samsung/smdkc110/smdkc110.c 中
dm9000_pre_init 进行了 DM9000 的初始化

 static void dm9000_pre_init(void)
{
unsigned int tmp; #if defined(DM9000_16BIT_DATA)//工作在16模式下
//SROM_BW_REG &= ~(0xf << 20);//
//SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20); SROM_BW_REG &= ~(0xf << );//修改
SROM_BW_REG |= (<<) | (<<) | (<<) | (<<); #else
SROM_BW_REG &= ~(0xf << );
SROM_BW_REG |= (<<) | (<<) | (<<);
#endif
//SROM_BC5_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
SROM_BC1_REG = ((<<)|(<<)|(<<)|(<<)|(<<)|(<<)|(<<)); tmp = MP01CON_REG;
tmp &=~(0xf<<);
tmp |=(<<);
MP01CON_REG = tmp;
}
上面的代码就是按照板上具体情况配置,下面两个图是上面修改的寄存器的信息

基地址的配置

 #ifdef CONFIG_DRIVER_DM9000
//#define CONFIG_DM9000_BASE (0xA8000000)
#define CONFIG_DM9000_BASE (0x88000300)
#define DM9000_IO (CONFIG_DM9000_BASE)
#if defined(DM9000_16BIT_DATA)
//#define DM9000_DATA (CONFIG_DM9000_BASE+2)
#define DM9000_DATA (CONFIG_DM9000_BASE+4)//4代表0100,正好代表ADDR2
#else
#define DM9000_DATA (CONFIG_DM9000_BASE+1)
#endif

上面也有提到,不同的 SROM BANK ,它们的基地址都是不同的,这里需要配置
之所以这里的基地址需要增加一个 0x300 的偏移,看到朱有鹏老师说可能是新版的 DM9000C 内部寄存器存在 0x300 的偏移
移植到此结束
 

————————————————
版权声明:本文为CSDN博主「greedyhao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/juhou/article/details/93376812

从三星官方uboot开始移植的更多相关文章

  1. 解决三星官方移植的内核默认是没有打开支持V4L USB devices

         在linux比较新的kernel,都标配了各类摄像头的驱动支持,不用我们自己移植驱动,只需通过make menuconfig配置内核支持我们所需的摄像头类型即可.以下是在三星官方内核中配置V ...

  2. 从零开始之uboot、移植uboot2017.01(二、从入口分析流程)

    原创: To_run_away 从零开始学linux 本节的开始之前,先看一下uboot的链接脚本. 一.链接脚本 /* * Copyright (c) 2004-2008 Texas Instrum ...

  3. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  4. 18.17 U-Boot+内核移植

    18.17.1 移植U-Boot-2012.04.08 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因. $ .tar.bz2 $ cd u-boot- $ make ...

  5. linux driver ------ 三星公司uboot模式下更改分区(EMMC)大小fdisk命令 ------ iTOP4412 开发板烧写

    核心板 SCP 1G eMMC:KLM8G------>8G 终端(串口)输入(如果执行过,只需要执行最后一句即可): 开发板一启动,立马在终端按回车,进入 uboot 模式 fdisk -c ...

  6. 从零开始之uboot、移植uboot2017.01(一、移植前的准备)

    手边的是一个S5PV210的开发板,想尝试移植一个比较新的uboot 下载最新版本uboot2018. ftp://ftp.denx.de/pub/u-boot/ 编译器下载 http://www.v ...

  7. uboot 的移植过程

    1. 工作用户 uboot 2. u­boot 版本 1.1.4 3. 工具链 2.95.3 步骤 我们为开发板取名叫: crane2410, 并在 u­boot 中建立自己的开发板类型 修改 Mak ...

  8. 虹软人脸识别——官方 Qt Demo 移植到 Linux

    一.前言 最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK.之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果.打开 Li ...

  9. 2017-9-13-Linux移植:u-boot的移植

    1.u-boot下载地址:http://ftp.denx.de/pub/u-boot/ 2.Linux环境下使用tar命令解压压缩包:tar -xzvf file.tar.gz tar -xvf fi ...

随机推荐

  1. Mockito 中文文档 ( 2.0.26 beta )

    Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...

  2. 【协作式原创】查漏补缺之Go的slice基础和几个难点

    [转载]队友博客 Q: 为啥要字节对齐的 https://www.nowcoder.com/discuss/57978 TODO: Q: go反汇编指令 go tool compile -S plan ...

  3. JVM类的加载顺序

    前阵子看到阿里巴巴的一提面试题是关于java类的加载顺序 package com.mikey.demo.Test; class FatherVariable{ static { System.out. ...

  4. P1135奇怪的电梯

    P1135奇怪的电梯 #include <iostream> #include <cstdio> #include <cstring> #include <a ...

  5. 吴裕雄--天生自然PythonDjangoWeb企业开发:框架基础和技术选型

    简单的Web Server import socket eol1 = b'\n\n' eol2 = b'\n\r\n' body = '''Hello,world!<h1>tszrwyx& ...

  6. 吴裕雄--天生自然PythonDjangoWeb企业开发:需求

    开发或者做一个项目,是要有一个需求过来的,而不是无缘无故的,启动一个项目,或者推动整个项目进行下一步迭代.这个需求可能是根据用户反馈增加的,可能是老板提出来的,也有可能是产品经理提出来的,但是无论是什 ...

  7. 【PAT甲级】1022 Digital Library (30 分)(模拟)

    题意: 输入一个正整数N(<=10000),接下来输入N组数据,ID,书名,作者,关键词,出版社,出版年份. 然后输入一个正整数M(<=1000),接下来输入查询的数据,递增输出ID,若没 ...

  8. git 常用命令记录 -- 快捷&备忘

    1.安装 略2.git拉取远程分支 git config user.name git config user.email git config --global user.name xxxx git ...

  9. 设计模式课程 设计模式精讲 8-2 单例设计模式-懒汉式及多线程Debug实战

    1 主要内容 1.1 多线程debug 1.2 synchronized同步锁的调用 1.3 懒加载的应用 2 代码演练 2.1 单线程调用 2.2 多线程调用 2.3 锁的调用 1 主要内容 1.1 ...

  10. 学习JNA,Jnative

    首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac ...