好文档 - 专业文书写作范文服务资料分享网站

我的arm - linux移植笔记

天下 分享 时间: 加入收藏 我要投稿 点赞

这个是内核的参数的起始地址,我们的板子内核是在0x30008000地址处,在从0x30000000到0x30008000的32kb之间存放的是内核页表和内核的启动参数, icache_enable(); dcache_enable();

gpio->GPBDAT = 0x180; //tekkamanninja

//int board_init (void)设置完成后,LED1和LED2会亮起! return 0; }

14. 为了实现NAND Flash的读写,再次修改/include/configs/tekkaman2440.h

(请格外注意:如果编译时报错,在Linux下用KWrite等有高亮显示的文本编辑器看看文件的注释是不是为注释应有的颜色(KWrite中为灰色),如果不是,则将注释删除。因为#define后面的注释被认为是程序的一部分。建议注释和#define分行写) ...... /*

* High Level Configuration Options * (easy to change) */

#define CONFIG_ARM920T 1 /* This is an ARM920T Core */ #define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */ #define CONFIG_tekkaman2440 1 /* on a SAMSUNG tekkaman2440 Board */ ......

/*********************************************************** * Command definition

***********************************************************/ #define CONFIG_COMMANDS \\ (CONFIG_CMD_DFL | \\ CFG_CMD_CACHE | \\ CFG_CMD_NAND | \\ CFG_CMD_NET | \\ /*CFG_CMD_EEPROM |*/ \\ /*CFG_CMD_I2C |*/ \\ /*CFG_CMD_USB |*/ \\ CFG_CMD_PING | \\ CFG_CMD_ENV | \\ CFG_CMD_REGINFO | \\ CFG_CMD_DATE | \\ CFG_CMD_DHCP | \\ CFG_CMD_ELF)

11

/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */

#include

#define CFG_LONGHELP /* undef to save memory */

#define CFG_PROMPT \ /*Monitor Command Prompt */ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ......

#define CFG_LOAD_ADDR 0x30008000 /* default load address */ ......

/* Timeout for Flash Write */

#define CFG_ENV_IS_IN_NAND 1 #define CFG_ENV_OFFSET 0X20000 //#define ENV_IS_EMBEDDED 1

#define CFG_NAND_LEGACY 定义后便调用我们的

board/tekkaman/tekkaman2440/tekkaman2440.c中的nand_init()函数进行nand初始化

#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */

/*---------------------------------------------------------------------- * NAND flash settings */

#if (CONFIG_COMMANDS & CFG_CMD_NAND) #define CFG_NAND_BASE 0x4E000000 /* NandFlash控制器在SFR区起始寄存器地址 */ #define CFG_MAX_NAND_DEVICE 1 /* 支持的最在Nand Flash数据 */ #define SECTORSIZE 512 /* 1页的大小 */

#define NAND_SECTOR_SIZE SECTORSIZE #define NAND_BLOCK_MASK 511 /* 页掩码 */

#define ADDR_COLUMN 1 /* 一个字节的Column地址 */ #define ADDR_PAGE 3 /* 3字节的页块地址!!!!!*/

#define ADDR_COLUMN_PAGE 4

12

/* 总共4字节的页块地址!!!!! */

#define NAND_ChipID_UNKNOWN 0x00 /* 未知芯片的ID号 */

#define NAND_MAX_FLOORS 1 #define NAND_MAX_CHIPS 1 /* Nand Flash命令层底层接口函数 */

这些前面基本已经提到/* Nand Flash命令层底层接口函数 */ #define WRITE_NAND_COMMAND(d, adr) {rNFCMD = d;} #define WRITE_NAND_ADDRESS(d, adr) {rNFADDR = d;} #define WRITE_NAND(d, adr) {rNFDATA = d;} #define READ_NAND(adr) (rNFDATA)

#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));} #define NAND_DISABLE_CE(nand) {rNFCONT |= (1<<1);} #define NAND_ENABLE_CE(nand) {rNFCONT &= ~(1<<1);} #define WRITE_NAND_COMMANDW(d, adr) NF_CmdW(d)

/* the following functions are NOP's because S3C24X0 handles this in hardware */ /* 下面一组操作对Nand Flash无效 */ #define NAND_CTL_CLRALE(nandptr) #define NAND_CTL_SETALE(nandptr) #define NAND_CTL_CLRCLE(nandptr) #define NAND_CTL_SETCLE(nandptr) /* 允许Nand Flash写校验 */

#define CONFIG_MTD_NAND_VERIFY_WRITE 1 ......

定义了各个寄存器

#define rNFCONF (*(volatile unsigned int *)0x4e000000) #define rNFCONT (*(volatile unsigned int *)0x4e000004) #define rNFCMD (*(volatile unsigned char *)0x4e000008) #define rNFADDR (*(volatile unsigned char *)0x4e00000c) #define rNFDATA (*(volatile unsigned char *)0x4e000010)

13

#define rNFSTAT (*(volatile unsigned int *)0x4e000020) #define rNFECC (*(volatile unsigned int *)0x4e00002c) #endif /* __CONFIG_H */

注:下面的这些定义是SKY提供的uboot参数,请按照这个参数把/include/configs/tekkaman2440.h修改过来

#define CONFIG_BOOTDELAY #define CONFIG_BOOTARGS 这里设置的都是传递给内核的参数,

initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。如果把需要的功能全都编译到内核中(非模块方式),只需要一个内核文件即可,我们这里就没有用到它,

root=/dev/mtdblock2 是指定文件系统路径,在dev/的第二个分区了

init=/linuxrc他是个脚本,放在文件系统的根目录下,里面是文件系统启动时要挂载所要执行的准备console=ttySAC0 用哪个串口 #define CONFIG_ETHADDR #define CONFIG_NETMASK #define CONFIG_IPADDR #define CONFIG_SERVERIP

0a:1b:2c:3d:4e:5f 网卡mac地址I ,全国独一个啊 255.255.255.0 192.168.1.8

\0x32000000 0 0x4C000; bootm 0x32000000\1 模式选折延时时间

\

192.168.1.6 \

/*#define CONFIG_BOOTFILE 0x4C000是变动的值 nboot InAddr dev FlAddr

#define CONFIG_BOOTCOMMAND

InAddr: 需要装载到的内存的地址。 FlAddr: 在nand flash上uImage存放的地址 dev: 设备号

需要提前设置环境变量,否则nboot不会调用bootm Tekkaman2440 #setenv autostart yes

0x4C000是内核在nand中起始的地址,看nand分区那就可以了解它的由来,在这里我们将内核搬运到0x32000000处,跳到此处执行什么呢?此时把压缩的内核进行解压,解压代码在内核的头部,解压到0x30008000处,这就是内核的解压后的地址。我们的内核最终是从这里开始执行的。 15. 在个文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。 (1)/include/common.h文件的第454行:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440)

(2)/include/s3c24x0.h文件的第85、95、99、110、148、404行: #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

14

(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

第38行:#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) (4)/cpu/arm920t/s3c24x0/serial.c文件的第22行:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

第26行:#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) void serial_setbrg (void) {

S3C24X0_UART * const uart = S3C24X0_GetBase_UART(UART_NR); int i;

unsigned int reg = 0;

/* value is calculated so : (int)(PCLK/16./baudrate) -1 */ reg = get_PCLK() / (16 * gd->baudrate) - 1; /* FIFO enable, Tx/Rx FIFO clear */ uart->UFCON = 0x00; uart->UMCON = 0x0;

/* Normal,No parity,1 stop,8 bit */ uart->ULCON = 0x3; ...... }

(5)/cpu/arm920t/s3c24x0/speed.c文件的第33行:

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

第37行:#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) 顺便修改源代码,以匹配s3c2440: static ulong get_PLLCLK(int pllreg) { ......

m = ((r & 0xFF000) >> 12) + 8; p = ((r & 0x003F0) >> 4) + 2; s = r & 0x3; //tekkaman

#if defined(CONFIG_S3C2440)

15

我的arm - linux移植笔记

这个是内核的参数的起始地址,我们的板子内核是在0x30008000地址处,在从0x30000000到0x30008000的32kb之间存放的是内核页表和内核的启动参数,icache_enable();dcache_enable();gpio->GPBDAT=0x180;//tekkamanninja//intboard_init(void)设置
推荐度:
点击下载文档文档为doc格式
3q3ea97wu606i7k4fy2m
领取福利

微信扫码领取福利

微信扫码分享