移植U-Boot.1.3.1到S3C244和S3C2410
对于1.3.1和1.2.0的差别,我初看了一下,(对于ARM920T内核)应该是增加了对ATMEL公司的AT91RM9200系列处理器的支持。至于S3C24X0系列的芯片,原理上并没有什么大的变化。
一、在U-Boot中建立自己的开发板类型,并测试编译。 我为开发板取名叫: tekkaman2440
[tekkamanninja@ARM9-Host working]$ tar -xjvf u-boot-1.3.1.tar.bz2
1 进入U-Boot目录,修改Makefile(我在fedora 8 下,比较喜欢使用KWrite)
[tekkamanninja@ARM9-Host working]$ cd u-boot-1.3.1
[tekkamanninja@ARM9-Host u-boot-1.3.1]$ kwrite Makefile
@$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2440: 开发板的型号(BOARD),对应于board/tekkaman/tekkaman2440目录。
tekkaman: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
2 在/board子目录中建立自己的开发板tekkaman2440目录
[tekkamanninja@ARM9-Host board]$ mkdir tekkaman tekkaman/tekkaman2440
[tekkamanninja@ARM9-Host board]$ cp -arf sbc2410x/* tekkaman/tekkaman2440/
[tekkamanninja@ARM9-Host board]$ cd tekkaman/tekkaman2440/
[tekkamanninja@ARM9-Host tekkaman2440]$ mv sbc2410x.c tekkaman2440.c
COBJS := tekkaman2440.o flash.o
[tekkamanninja@ARM9-Host tekkaman2440]$ cd ../../..
[tekkamanninja@ARM9-Host u-boot-1.3.1]$ cp include/configs/sbc2410x.h include/configs/tekkaman2440.h
1、配置 [tekkamanninja@ARM9-Host u-boot-1.3.1]$ make tekkaman2440_config
Configuring for tekkaman2440 board...
(1) 如果出现:
$ make tekkaman2440_config
Makefile:1927: *** 遗漏分隔符 。 停止。
请在U-boot的根目录下的Makefile的
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman)
前加上“Tab”键
2、测试编译
[tekkamanninja@ARM9-Host u-boot-1.3.1]$make
测试通过后进行下一步
start_code: |
(0)修改寄存器地址定义
#if defined(CONFIG_S3C2400) |
(1)修改中断禁止部分
|
(2)修改时钟设置(2440的主频为405MHz。)
/*now, CPU clock is 405.00 Mhz tekkaman*/ mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/ /*now, CPU clock is 202.8 Mhz tekkaman*/ # endif |
红色部分是我添加的,利用vivi的代码。
(3)将从Flash启动改成从NAND Flash启动。
在以下U-Boot的重定向语句段:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT ldr r2, _armboot_start copy_loop: |
的后面添加上:
ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control ldr r2, =(0x6) @ RnB Clear mov r3, #0 @ wait nand2: ldr r2, [r1, #oNFCONT] @ get read to call C functions (for nand_read()) @ copy U-Boot to RAM bad_nand_read: ok_nand_read: notmatch: #endif @ CONFIG_S3C2440_NAND_BOOT #ifdef CONFIG_S3C2410_NAND_BOOT mov r3, #0 @ wait nand2: ldr r2, [r1, #oNFCONF] @ get read to call C functions (for nand_read()) @ copy U-Boot to RAM bad_nand_read: ok_nand_read: notmatch: #endif @ CONFIG_S3C2410_NAND_BOOT |
在“ldr pc, _start_armboot”之前加入:
|
修改目的:如果看到只有LED1亮了,说明U-Boot的第一阶段已完成!(针对友善之臂SBC2440V4,不是这块开发板的,必须修改或不添加)
在 “ _start_armboot: .word start_armboot ” 后加入:
|
2 在board/tekkaman/tekkaman2440加入NAND Flash读函数文件,拷贝vivi中的nand_read.c文件到此文件夹即可:
#define __REGb(x) (*(volatile unsigned char *)(x)) # if defined(CONFIG_S3C2440) #define NFCONF __REGi(NF_BASE + 0x0) #define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) #define BUSY 4 #define NAND_SECTOR_SIZE 512 /* low level nand read function */ if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { NAND_CHIP_ENABLE; for(i=start_addr; i < (start_addr + size);) { /* Write Address */ NAND_DETECT_RB; for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { # if defined(CONFIG_S3C2410) #define NFCONF __REGi(NF_BASE + 0x0) inline void wait_idle(void) { |
3 修改board/tekkaman/tekkaman2440/Makefile文件
|
4 修改include/configs/tekkaman2440.h文件,添加如下内容:
/* NAND Flash Controller */ # if defined(CONFIG_S3C2440) # if defined(CONFIG_tekkaman2440_LED) #endif # if defined(CONFIG_S3C2410)
|
5 修改board/tekkaman/tekkaman2440/lowlevel_init.S文件 依照开发板的内存区的配置情况, 修改board/tekkaman/tekkaman2440/lowlevel_init.S文件,我利用友善之臂提供的vivi源码里的信息做了如下更改:
#if defined(CONFIG_DRIVER_NE2000) #define B3_BWSCON (DW16 + WAIT + UBLB) /* REFRESH parameter */ # if defined(CONFIG_S3C2440) |
6 修改/board/tekkaman/tekkaman2440/tekkaman2440.c
修改其对GPIO和PLL的配置(请参阅开发板的硬件说明和芯片手册):
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */ #if defined(CONFIG_S3C2410) /* Fout = 202.8MHz */ #if defined(CONFIG_S3C2440) #if USB_CLOCK==0 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440) #define U_M_SDIV 0x2 #if defined(CONFIG_S3C2410) /* arch number of SMDK2410-Board */ #if defined(CONFIG_S3C2440) #endif |
7 为了实现NAND Flash的读写,再次修改/include/configs/tekkaman2440.h
(请格外注意:如果编译时报错,在Linux下用KWrite等有高亮显示的文本编辑器看看文件的注释是不是为注释应有的颜色(KWrite中为灰色),如果不是,则将注释删除。因为#define后面的注释被认为是程序的一部分。建议注释和#define分行写)
//#define CONFIG_SBC2410X 1 /* on a friendly-arm SBC-2410X Board */ #define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */ #define CONFIG_CMD_ASKENV #define CONFIG_CMD_JFFS2 /* JFFS2 Support 080218 */ #define CONFIG_CMD_USB /* USB Support 080218 */ #define CONFIG_CMD_FAT /* FAT support 080218 */ ...... /* timeout values are in ticks */ #define CFG_ENV_IS_IN_NAND 1 #define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */ /*---------------------------------------------------------------------- # if defined(CONFIG_S3C2440) #define NAND_CTL_CLRALE(nandptr) |
8、在个文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。
(1)/include/common.h文件的第474行:
|
(2)/include/s3c24x0.h文件的第85、95、99、110、148、404行:
将“#ifdef CONFIG_S3C2410”改为
|
顺便在其中加入2440 的NAND FLASH 寄存器定义(第160行附近)和CAMDIVN定义(第128行附近):
|
(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行:
|
第38行:
|
在个文件中添加“defined(CONFIG_tekkaman2440)”,使得原来SBC2410X的代码可以编译进来。第181行:
|
(4)/cpu/arm920t/s3c24x0/serial.c文件的第22行:
|
第26行:
|
(5)/cpu/arm920t/s3c24x0/speed.c文件的第33行:
|
第37行:
|
顺便修改源代码,以匹配s3c2440:
m = ((r & 0xFF000) >> 12) + 8; #if defined(CONFIG_S3C2440) return((CONFIG_SYS_CLK_FREQ * m) / (p << s)); #if defined(CONFIG_S3C2440) } |
(6)/cpu/arm920t/s3c24x0/usb_ohci.c文件的第45行:
|
(7)drivers/rtc/s3c24x0_rtc.c文件的第35行:
|
(8)/cpu/arm920t/s3c24x0/usb.c文件的第31行:
|
(9)/cpu/arm920t/s3c24x0/i2c.c文件的第35行:
|
第66、85、142、150、174行:
将“#ifdef CONFIG_S3C2410”改为
|
(10)drivers/usb/usb_ohci.c文件的第68行附近:
|
9、在 include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入
|
修改include/linux/mtd/nand.h
|
10、修改/lib_arm中的board.c。
return (0); #endif |
11、 修改common/env_nand.c
int nand_legacy_rw (struct nand_chip* nand, int cmd, #else /* ! CFG_ENV_OFFSET_REDUND */ puts ("Erasing Nand...");//if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE)) if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0)) puts ("Writing to Nand... "); ret = nand_legacy_rw(nand_dev_desc + 0, if (ret || total != CFG_ENV_SIZE) puts ("done\n"); total = CFG_ENV_SIZE;//ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr); ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE, &total, (u_char*)env_ptr); |
12、 在/board/tekkaman/tekkaman2440/tekkaman2440.c文件的末尾添加对Nand Flash 的初始化函数(在后面Nand Flash的操作都要用到)
u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用 drivers/nand/nand.c中的nand_init();否则调用自己在board/tekkaman/tekkaman2440/tekkaman2440.c中的nand_init()函数。这里我选择第二种方式。
static inline void NF_Conf(u16 conf) static inline void NF_Cmd(u8 cmd) static inline void NF_CmdW(u8 cmd) static inline void NF_Addr(u8 addr) static inline void NF_WaitRB(void) static inline void NF_Write(u8 data) static inline u8 NF_Read(void) static inline u32 NF_Read_ECC(void) #if defined(CONFIG_S3C2440) static inline void NF_SetCE(NFCE_STATE s) static inline void NF_Init_ECC(void) #else static inline void NF_Init_ECC(void) static inline void NF_Reset(void) NF_SetCE(NFCE_LOW); static inline void NF_Init(void) #if defined(CONFIG_S3C2440) void nand_init(void) NF_Init(); |
三、交叉编译U-Boot。
在U-Boot的根目录下
$make
一阵English飘过~~~~~~~~~~~~~~~~~~~~~~~
这篇文章的移植使用CS8900网卡。tftp功能是可用的.
移植U-Boot.1.3.1到S3C244和S3C2410相关推荐
- 移植U-Boot.1.3.1到S3C2440和S3C2410
原文链接:[url]http://blog.chinaunix.net/u1/34474/showart.php?id=487416[/url] 首先,U-Boot1.3.1还没有支持s3c2440, ...
- mtk android 5.1 logo,Android ROM DIY之MTK平台手机通用移植
在之前的文章中,我们讨论过ROM刷机原理,修改ROM包以及如何让ROM包获取root权限.那么接下来,我们谈谈MTK平台手机ROM移植的话题.如果你是ROM小白,那么建议可以先看看之前的文章. ROM ...
- 【u-boot】uboot代码简要分析 (u-boot 移植)
uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...
- 我所理解的高通UEFI之display的流程和移植
UEFI的流程 UEFI跟uboot一样都是在在kernel加载启动之前,正确的引导指定启动服务,并向内核传递信息,代替原先的uboot.它包含了上电.驱动实现,以及os环境的建立和应用程序(类似于f ...
- 创维 linux内核,Linux2.6内核在创维特jx2410平台上的移植一
我参考网上的资料做了linux2.6.14内核的移植.创维特jx2410的配置:cpu:s3c2410, 32M Nor Flash(Intel 28F128), 64M SDRAM.Nor Flas ...
- u-boot移植到mini2440,u-boot版本2008.10
这篇文章写于2008.12.28日,主要记录了我移植u-boot-2008.10的过程,并附上了移植好的patch文件.移植好的u-boot-2008.10适用友善公司的mini2440和阳初公司的y ...
- 嵌入式研发人员的核心竞争力浅谈 .
夜深人静,万籁俱寂,正是思考的时间.这几天,我一直在想:什么才是一个嵌入式研发人员的核心竞争力? 核心竞争力是个很有诱惑力的词,它意味着你拥有别人不能简单复制的能力.经验.在职场中,竞争只存在于你和你 ...
- 基于AT91SAM9G20构建嵌入式Linux系统
本文中使用的目标平台AT91SAM9G20是Atmel公司使用ARM926EJ-S处理器内核开发的一块SoC嵌入式微处理器,主频达到400MHz,具有Atmel 先进的外设DMA 和分布式存储器架构, ...
- S5PV210启动过程分析
学习任何一款处理器,首先要搞清楚它的启动流程. 参考<S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf> 一.iROM启动方式简介 ...
最新文章
- Appscan漏洞 之 加密会话(SSL)Cookie 中缺少 Secure 属性
- ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
- linux信号学习02
- Django之form表单组件、cookie与session
- docker 相关操作
- edge linux 下载软件,在Linux上安装edge浏览器
- 智能会议系统(2)---Android 2.3 APIs SIP-based VoIP
- 电脑文件夹同步软件哪个比较好用?
- 怎样利用计算机随机分组,随机分组编制方法哪家强
- 三、单因素方差分析例题(R语言)
- 11408考研复习规划
- java find 方法,findOne方法是findOne(Example
- C# CS客户端不显示垂直滚动条
- 在虚拟机中使用软路由进行组网
- Javascript技巧(230个)[转载]
- 【Unity3D 问题总结】Failed to import package with error: Couldn‘t decompress package
- 微信公众号留言评论功能最新开通信息讲解(内附留言功能开通视频信息讲解链接)...
- ObjectARX2010二次开发之 --- DXF转G代码(1)
- android 9.0 10.0 添加系统字体并且设置为默认字体
- 农产品商城毕业设计,农产品销售系统毕业设计,农产品电商毕业设计论文方案需求分析作品参考
热门文章
- 网易我的世界中国版服务器存档文件在哪里,网易我的世界怎么导入存档 网易中国版手游存档位置...
- A Survey on Deep Transfer Learning 2018 翻译
- 沐风:小程序推广高手速成秘笈
- 51单片机控制二相四线步进电机
- 各类文件头及其十六进制标识
- 《Python全栈系列教程》目录
- Mtk WIFI常用调试命令
- python 爬取拉钩网数据
- org.hibernate.PersistentObjectException: detached entity passed to persist: cn.edu.xupt.bean.Users
- 教你一键制作纯净Win10系统安装盘