之前做过u-boot-1.1.6在AT91RM9200的移植,虽然2410和9200这两款ARM9芯片都是ARM920T核的,但还是有不少区别的,特别是启动方式(当然前者是工业级后者是民用级不必说)。at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader, 用来支持程序的下载和引导,而且其内部固化的程序提供了很多内部服务接口(Internel Service)供我们来使用,例如Xmodem;而S3C2410启动是把nandflash的前4K代码自动搬到Steppintstone中去运行,而Steppingstone使用的物理地是从0号位置开始的。(当然如果是Nor Flash启动,两者是相同的)
1.开发环境
宿主机:FC11
之前编译的arm-linux-gcc-3.4.5-softfloat,请参见:
http://blog.csdn.net/shevsten/archive/2007/07/14/1691197.aspx
开发板: GEC2410 NAND Flash:64M K9F1208, NOR Flash:2M SST39VF1601 SDRAM 64M, CS8900A
2.下载u-boot-1.1.6源码
u-boot的源码可以从以下网址下载:
ftp://ftp.denx.de/pub/u-boot/
解压放到指定目录:
# tar -xvjf u-boot-1.1.6.tar.bz2
3.建立自己GEC2410开发板的配置
复制smdk2410的开发板配置,然后在做相应修改,由于Uboot1.1.6对SMDK2410板的NAND Flash初始化部分没有写,主要移植内容为Nand Flash部分.
复制smdk2410目录及对应头文件,并改名为gec2410:
1)# cp –r board/smdk2410 board/gec2410
2)# cp include/configs/smdk2410.h include/configs/gec2410.h
4.修改顶层Makefile
(1)增加gec2410配置
找到Line 1879:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
在其后面添加:
gec2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t gec2410 NULL s3c24x0
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
fs2410: 开发板的型号(BOARD),对应于board/fs2410目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
这样在执行make gec2410_config命令后就把环境变量设置好了
(2)设置编译器路径(Line 127)
ifeq ($(ARCH),arm)
CROSS_COMPILE = /home/GEC2410/toolchain/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-
5.修改u-boot的命令行提示符
include/configs/gec2410.h第111行:
修改:
# define CFG_PROMPT "SMDK2410 #"
为:
# define CFG_PROMPT "GEC2410 #"
这是u-boot的命令行提示符。
6.修改board/gec2410/Makefile
将:
COBJS := smdk2410.o flash.o
改为:
COBJS := gec2410.o flash.o
gec2410下的smdk2410.c改成gec2410.c;
7.修改board/gec2410/lowlevel_init.S文件
参考GEC2410开发板自带BIOS里的配置参数,主要是SDRAM时序参数的配置.
/* BWSCON */
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)
//#define B1_BWSCON (DW32)
#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
/* BANK0CON */
#define B0_Tacs 0x3 /*0x0 0clk */
#define B0_Tcos 0x3 /*0x0 0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x3 /*0x0 0clk */
#define B0_Tah 0x3 /*0x0 0clk */
#define B0_Tacp 0x1
#define B0_PMC 0x0 /* normal */
/* BANK1CON */
#define B1_Tacs 0x3 /* 4clk */ /*0x0 0clk */
#define B1_Tcos 0x3 /* 4clk */ /*0x0 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x3 /* 4clk */ /*0x0 0clk */
#define B1_Tah 0x3 /* 4clk */ /*0x0 0clk */
#define B1_Tacp 0x3
#define B1_PMC 0x0
#define B2_Tacs 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah 0x0
#define B2_Tacp 0x0
#define B2_PMC 0x0
#define B3_Tacs 0x0 /* 0clk */
#define B3_Tcos 0x3 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x3 /* 6clk */
#define B3_PMC 0x0 /* normal */
这时候可以测试下编译是否成功
#make gec2410_config
#make
u-boot-bin目录下会出现u-boot.bin
8.board/fs2410加入NAND Flash读函数,建立nand_read.c(从开发板提供的u-boot-1.1.4中复制board/gec2410/nand_read.c,实际上就是从vivi中拷贝过来的)代码比较简单,实际上就一个读NAND的函数,代码如下:
具体对NAND的操作可参考CE下NAND驱动分析:
http://blog.csdn.net/shevsten/archive/2010/04/27/5533400.aspx
/*
* nand_read.c: Simple NAND read functions for booting from NAND
*
* Copyright (C) 2002 MIZI Research, Inc.
*
* Author: Hwang, Chideok * Date : $Date: 2002/08/14 10:26:47 $ * * $Revision: 1.6 $ * $Id: param.c,v 1.9 2002/07/11 06:17:20 nandy Exp * * */ #include #define __REGb(x) (*(volatile unsigned char *)(x)) #define __REGi(x) (*(volatile unsigned int *)(x)) #define NF_BASE 0x4e000000 #define NFCONF __REGi(NF_BASE + 0x0) #define NFCMD __REGb(NF_BASE + 0x4) #define NFADDR __REGb(NF_BASE + 0x8) #define NFDATA __REGb(NF_BASE + 0xc) #define NFSTAT __REGb(NF_BASE + 0x10) #define BUSY 1 inline void wait_idle(void) { int i; while(!(NFSTAT & BUSY)) for(i=0; i<10; i++); } #define NAND_SECTOR_SIZE 512 #define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1) /* low level nand read function */ int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) { int i, j; if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { return -1; /* invalid alignment */ } /* chip Enable */ NFCONF &= ~0x800; for(i=0; i<10; i++); for(i=start_addr; i < (start_addr + size);) { /* READ0 */ NFCMD = 0; /* Write Address */ NFADDR = i & 0xff; NFADDR = (i >> 9) & 0xff; NFADDR = (i >> 17) & 0xff; NFADDR = (i >> 25) & 0xff; wait_idle(); for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { *buf = (NFDATA & 0xff); buf++; } } /* chip Disable */ NFCONF |= 0x800; /* chip disable */ return 0; } 接着修改board/gec2410/makefile,增加对nand_read.c的编译 第28行: COBJS := gec2410.o flash.o nand_read.o 9.修改cpu/arm920t/start.S文件 2410从Nand Flash启动时,NAND FLASH的前4KB(地址为0x00000000,OM[1:0]=0)将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码.启动以后,这4KB的空间可以做其他用途,在start.S加入搬运代码. 主要工作开始初始化NAND控制器,然后调用nand_read.c中的nand_read_ll函数来复制u-boot自身代码到RAM中,最后跳转到RAM中运行.汇编代码如下: #ifdef CONFIG_S3C2410_NAND_BOOT bl copy_myself @ jump to ram ldr r1, =on_the_ram add pc, r1, #0 nop nop 1: b 1b @ infinite loop on_the_ram: #endif /* Set up the stack */ stack_setup: #.............. ###################################### ldr pc, _start_armboot _start_armboot: .word start_armboot #ifdef CONFIG_S3C2410_NAND_BOOT copy_myself: mov r10, lr @ reset NAND mov r1, #NAND_CTL_BASE ldr r2, =0xf830 @ initial value str r2, [r1, #oNFCONF] ldr r2, [r1, #oNFCONF] bic r2, r2, #0x800 @ enable chip str r2, [r1, #oNFCONF] mov r2, #0xff @ RESET command strb r2, [r1, #oNFCMD] mov r3, #0 @ wait 1:add r3, r3, #0x1 cmp r3, #0xa blt 1b 2:ldr r2, [r1, #oNFSTAT] @ wait ready tst r2, #0x1 beq 2b ldr r2, [r1, #oNFCONF] orr r2, r2, #0x800 @ disable chip str r2, [r1, #oNFCONF] @ get read to call C functions (for nand_read()) ldr sp, DW_STACK_START @ setup stack pointer mov fp, #0 @ no previous frame, so fp=0 @ copy vivi to RAM ldr r0, =UBOOT_RAM_BASE mov r1, #0x0 mov r2, #0x20000 bl nand_read_ll tst r0, #0x0 beq ok_nand_read #ifdef CONFIG_DEBUG_LL bad_nand_read: ldr r0, STR_FAIL ldr r1, SerBase bl PrintWord 1:b 1b @ infinite loop #endif ok_nand_read: #ifdef CONFIG_DEBUG_LL ldr r0, STR_OK ldr r1, SerBase bl PrintWord #endif @ verify mov r0, #0 ldr r1, =UBOOT_RAM_BASE mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes go_next: ldr r3, [r0], #4 ldr r4, [r1], #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq done_nand_read bne go_next notmatch: #ifdef CONFIG_DEBUG_LL sub r0, r0, #4 ldr r1, SerBase bl PrintHexWord ldr r0, STR_FAIL ldr r1, SerBase mov r2, #0 mov r3, r2 mov r4, r2 mov r5, r2 mov r6, r2 mov r7, r2
上一篇:linux 2.6.24.4在S3C2410上的移植(内核配置)(基于GEC2410)
下一篇:AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
推荐阅读最新更新时间:2024-11-16 20:16
推荐帖子
- Altium Designer 6。6绘制原理图,制作PCB
- 感觉很好用,我这还有配套的封装库!!!想要得留下邮箱把!AltiumDesigner6。6绘制原理图,制作PCB好。文件有多大?请发到公共信箱吧,让大家都去下载,不麻烦你一个个发了,呵呵。。回复:AltiumDesigner6。6绘制原理图,制作PCB楼主我只要封装库,麻烦发给我一下,pxy94@163.com回复:AltiumDesigner6。6绘制原理图,制作PCB原帖由qufuybj于2007-8-308:57:00发表好。文件有多大?请发到公
- 歹匕示申 PCB设计
- 求教vxworks的调试方法
- 本人使用VxWorks时遇到问题,描述如下:1.系统什么应用程序都没有,只有个VXwroks系统和定时器、串口、网口驱动。2.在ping开发板网络时出现了系统复位!!!!!请问大神:vxwork下有哪些有效的调试方法能够定位这个问题,或者vxworks下有哪些通用的调试方法,求大神传授调试经验,万分感谢!小弟也有vxworks的部分资料,如果有需要可以提供!!!求教vxworks的调试方法
- whwshiyuan1984 实时操作系统RTOS
- 求AD画PCB版图教程
- 新手报到!求大神指点AD画PCB版图教程,谢谢!求AD画PCB版图教程先去下载资料看看吧下载中心,输入AltiumDesigner教程
- DickDragon PCB设计
- 5v怎么转到6v求大神给个电路图做参考
- 5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考需要多大电流?电流不太大的话,可以考虑使用MC34063A。此芯片性能并不好,但比较便宜。比较容易实现的可以用LM2577,静态电流比较大,输出功率也大,如果想要效率高体积小那就得找专业芯片了 毕设的时候用过这个芯片:)电路挺简单的电流要说清楚,关系到功率的不考虑功率的话,随便找个升压ic就行。 给stm32供电用的,
- PCB学徒 模拟与混合信号
- 基于msp430单片机1602 DS1802温度显示
- 最近调好了DS1802温度传感器,用的是430G2553单片机,温度保留两位小数。把源代码分享给大家。 /***************************************** msp430g2553实现1602温度显示 来源:汪中原的博客 ******************************************/ #include #defineucharunsignedchar #defineuintunsignedint
- fish001 微控制器 MCU
- 中国标准的电波钟信号模拟器
- 调试电波钟很方便,使用标准的esp32开发板,直接在io脚上连接了一个汽车无钥匙进入用的125k发射天线(频率误差极大,正确的应该是68.5k),所以效率会很低,实际测试能在2米内可靠干扰电波钟的时间,如果使用频率匹配的天线io驱动应该不够,需要加一级驱动电路,比较合适的是mos门级驱动芯片使用pwm生成载波误差还不算大,偏差7hz左右,效果算是很好的了中国标准的电波钟信号模拟器附件资料是个什么格式68.5k自己用铜线绕一个大线圈效果能好点。学习了,内容非常清晰,非
- wangshujun72 MicroPython开源版块
设计资源 培训 开发板 精华推荐
- 具有 150mA 输入电流限制的 LTC3630AMPMSE 24.5V 至 76V 输入至 24V 输出的典型应用电路
- EVAL-ADE7169EBZ-2,带有 8052 MCU、RTC 和 LCD 驱动器的 ADE7116 单相电能计量 IC 评估套件
- 使用 Microchip Technology 的 MCP2515-E/P 的参考设计
- 烙铁控制器
- 【成航PCB赛】音频功率放大电路
- LTC1705EGN 演示板,英特尔 Geyserville VRM,Vin = 4.5 - 5.5V,0.925V - 2V @ 14Amp,1.5V @ 2.5A 和 2.5V @ 150mA 输出
- LTC4354 负电压二极管“或”控制器和监视器的典型应用
- 使用 ROHM Semiconductor 的 BA18BC0WT 的参考设计
- DER-717 - 基于InnoSwitch3-CE的15 W适配器,具有±30 kV ESD能力
- RDR-853 - 使用 BridgeSwitch 电机驱动器和 LinkSwitch-TN2 的 300 W 高热性能三相逆变器
- 昔日苹果供应商中航三鑫连亏6年成业绩“包袱”
- 科大讯飞之惑:遭质疑股价大跌 盈利跑不过市值
- Cannon Lake已死?英特尔辟谣:并未终止10nm开发,已取得良好
- 复旦大学徐鸿涛:射频组件已占iPhone一半主板尺寸 未来应用
- 小米 MIX 3 将支持更快的无线充电
- 高通5G战略全面拉开,携手三星、爱立信加速2019年商用,探
- 五年内AI营收占40%!比特大陆被低估的AI雄心
- 11nm LPP+ X12 Modem+第三代AI Engine加持,高通骁龙675全新架构发布
- 电量更高寿命更长 三星Galaxy S10或将配备石墨烯电池
- 硬件问题?国外用户反映Pixel 3 XL扬声器出现杂音现象