2015年(31)
分类: 嵌入式
2015-10-27 12:17:49
一.
1.环境
uboot: u-boot1.1.6
board: TQ2440
compile: crosstools_3.4.5_softfloat
cpu: s3c2440
nand: 256MB ---> K9F2G08U0A
nor: 2M ----> EN29LV160AB
2.删除不需要的文件。也可以不用做这一步。
cd board
rm -rf `ls | grep -v "^smdk2410"`
cd ../cpu
rm -rf `ls | grep -v "^arm920t"`
cd ../include
rm -rf `ls | grep "^asm-*" | grep -v "asm-arm"`
cd ..
rm -rf `ls | grep "lib_*" | grep -v "lib_arm" | grep -v "lib_generic"`
cd include/configs
rm -rf `ls | grep -v "smdk2410.h"`
3.建立目标板
在第二步删除文件中,保留了smdk2410相关的部分。默认的当前路径为uboot的解压目录u-boot-1.1.6下。
cp -rf board/smdk2410 board/my2440
mv board/my2440/smdk2410.c board/my2440.c
vim board/my2440/Makefile
修改
COBJS := my2440.o flash.o
cp include/configs/smdk2410.h include/configs/my2440.h
vim Makefile
仿照smdk2410_config增加:
my2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t my2440 NULL s3c2440
CROSS_COMPILE使用交叉编译器crosstools_3.4.5_softfloat
4.测试目标板
make distclean
make my2440_config
make all
Makefile中:
my2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t my2440 NULL s3c2440
执行的是目录中的mkconfig
相关:shell,Makefile,自动Makefile,工程管理,嵌入式开发的调试相关,JTAG,半主机制,管道,命令替换,常见的linux命令。
二.uboot第一阶段
1.找入口文件:
Makefile ---> 执行脚本mkconfig,生成include/config.h文件,其内容:
#include
第一个目标文件为:OBJS =cpu/$(CPU)/start.o
在目标板目录board/my2440下文件U-boot.lds中也指定了起始代码段为start.o
程序应从start.s开始:
相关:linux的连接代码的段配置,默认段,scatter文件格式 。
2.
2.1
start.s文件是uboot的第一阶段,通过
ldr pc, _start_armboot
_start_armboot : .word start_armboot
跳转到第二阶段
异常向量表:前面8个字是8条跳转指令,跳转到对应的模式:
复位,未定义,软件中断,预取指,数据中止,保留,中断,快中断
此段代码存放的起始地址:u-boot.lds中确定为0
在运行时的运行地址:system.map中确定为0x33f80000
相关:代码重定向,代码的可重入性, 存储地址(非易失性存储器上)与运行地址(ram)。adr/ldr伪指令取得标号地址差异。文字池范围4k。arm指令,
2.2
arm启动过程:
上电,复位。
按引脚om[3:2]确定时钟,om3-->主时钟,om2--->usb时钟,0--->晶振,1--->外部clk。
刚启动时PLL没有工作,要等配置后才PLL才能使用。
按om[1:0]确定bank0的总线宽度,00--->nand, 01-->16,10--->32, 11--->测试。
当为00时,使用nand启动,内部的4k sram映射到0x00000000处,自动将nand的前4k拷贝到sram中执行。
nand引脚: GPG13--- 0---->256word 1kword, 1---512byte 2kbyte
GPG14---- 0---3/4周期, 1---4/5周期
GPG15 --- 0 ---8bit, 1---16bit
从nand启动时:前面的4k代码中还要要完成从nand读数据到ram内存中。
非nand启动时:内部的4k sram映射到0x40000000处,从地址0x00000000对应的NOR Flash中取指执行。
2.3修改start.S:
2.3.1屏蔽中断:
ldr r1, #0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
2.3.2时钟设置:
#define LOCKTIME 0x4C000000
#define MPLLCON 0X4C000004
#define UPLLCON 0X4C000008
#define M_MDIV 0X7F
#define M_PDIV 0X2
#define M_SDIV 0X1
#define U_MDIV 0X38
#define U_PDIV 0X2
#define U_SDIV 0X2
/* FCLK:HCLK:PCLK = 1:4:8 */
/* default FCLK is 400 MHz ! */
ldr r0, =LOCKTIME
ldr r1, =0xffffff
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
MMU_SetAsyncBusMode:
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0xc0000000
mcr p15, 0, r0, c1, c0, 0
ldr r0, =UPLLCON
ldr r1, =((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
str r1, [r0]
nop
nop
nop
nop
nop
nop
nop
ldr r0, =MPLLCON
ldr r1, =((M_MDIV<<12) | (M_PDIV<<4) | M_SDIV)
str r1, [r0]
nop
nop
nop
nop
nop
nop
nop
2.4
lowlevel_init.S中修改:
B1总线宽度为: DW16
刷新周期为: 0X4f4 //7.8125, HCLK= 100MHz, (2048+ 1 - 7.8125 * 100)
即:
board/my2440/lowlevel_init.S
#define B1_BWSCON (DW16) //
#define REFCNT 0X4f4 //7.8125, HCLK= 100MHz, (2048+ 1 - 7.8125 * 100)
2.5
相关:
p15协处理器的寄存器;
rom, sdram, sram,字宽,地址线对应关系;
nwe , nwbe*, nbe*, DQM*关系
Tacs, Tcos, Tacc,Tacp, Tach, Tcoh,
Trp, Trcd, Tcl,行周期=预充电Trp+ 半行周期Tsrc
sdram结构:4bank,列地址与行地址线复用,
Nor与nand:
三.文件speed.c中的函数:
get_PLLCLK
get_HCLK
get_PCLK
get_FCLK
根据时钟计算关系修改即可。
四:nand启动
4.1增加从nand启动:
start.S中添加(在relocate前):
#define BWSCON 0X48000000
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #0x6
bne nor_boot
#ifdef CFG_S3C2440_NAND_BOOT
nand_boot:
#define LENGTH_UBOOT 0X30000
#define NAND_CTL_BASE 0X4E000000
#define oNFCONF 0X00
#define oNFCONT 0X04
#define oNFCMD 0X08
#define oNFSTAT 0X20
#define TACLS 0X07
#define TWRPH0 0X07
#define TWRPH1 0X07
mov r1, #NAND_CTL_BASE
ldr r2, =((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4))
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONT]
orr r2, r2 , #((1<<4) | (1<<1) | (1<<0)) //initecc, disable chip_select, nand controller enable,
str r2, [r1, #oNFCONT]
ldr sp, DW_STACK_START
mov fp, #0
ldr r0 , =TEXT_BASE
mov r1, #0
mov r2, #LENGTH_UBOOT
bl nand_read_ii
tst r0, #0
beq ok_nand_read
bad_nand_read:
loop2:
b loop2
ok_nand_read:
//verify 4k bytes ,0x00000000, 0x33f80000
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x1000
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
tst r2, #0
bne go_next
beq stack_setup
notmatch:
loop3:
b loop3
nor_boot:
#endif /* CFG_S3C2440_NAND_BOOT */
4.2
在指令 ldr pc, start_armboot后面添加
#define STACK_BASE 0X33F00000
#define STACK_SIZE 0X10000
.align 2
DW_STACK_START:
.word STACK_BASE + STACK_SIZE - 4
4.3
增加nand_read_ii.c实现uboot代码从nand读到ram中
#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 NFCONT __REGi(NF_BASE + 0X4)
#define NFCMD __REGb(NF_BASE + 0X8)
#define NFADDR __REGb(NF_BASE + 0XC)
#define NFDATA __REGb(NF_BASE + 0X10)
#define NFSTAT __REGb(NF_BASE + 0X20)
#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB {WHILE(!(NFSTAT&(1<<2)));}
#define NAND_ECC_CLEAR (NFCONT |= 0X10)
#define BUSY 1
static inline void wait_idle(void)
{
int i;
while(!(NFSTAT & BUSY))
{
for(i=0; i<10; i++)
;
}
}
#define NAND_SECTOR_SIZE 2048
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE-1)
//read from nand
int nand_read_ii(unsigned char *buf, unsigned long start_addr, int size)
{
int i=0, j=0;
int pagenum=0;
if((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
return -1; /*invalid alignment*/
NAND_CHIP_ENABLE;
for(i=start_addr; i<(start_addr + size); )
{
NAND_CLEAR_RB;
for(j=0; j<10; j++)
;
pagenum = (i>>11);
NFCMD = 0;
NFADDR = 0;
NFADDR = 0;
NFADDR = pagenum & 0xff;
NFADDR = (pagenum >> 8) & 0xff;
NFADDR = (pagenum >> 16) & 0xff;
NFCMD = 0X30;
wait_idle();
for(j=0; j
}
i += NAND_SECTOR_SIZE;
}
return 0;
}
4.4
在my2440.h中增加:CONFIG_S3C2440, CFG_S3C2440_NAND_BOOT
nand_read_ii.c存放位置的Makefile中的COBJS增加nand_read_ii.o,连接文件u-boot.lds中将nand_read.o放在start.o后面,保证这个代码段链接后处于整个程序段的前4k范围内。
4.5
ale/cle时序:tacls+ twrph0+ twrph1期间指令或地址,twrph0内nwe为低。
nwe/nre时序: twrph0+ twrph1数据。twrph0内nwe/nre为低,
复用:ale,cle,nwe,nre区别是地址,指令,读,写
一页2k字节,地址5个周期传送,2周期列地址,3周期行地址
4.6
相关:
函数指针,程序的可移植性,条件编译,全局变量的引用,ecc,atpc,栈帧,c中的setjmp和longjmp,c中可变参数的实现,栈类型,c与汇编混合编程,r0-r14的使用规则,总线,同步异步通信,
4.7
时钟设置可以到board_init函数中执行。具体方法:
添加
clk_power->CLKDIVN = S3C2440_CLKDIV;
__asm__("mrc p15, 0, r1, c1, c0, 0\n" /* 读出控制寄存器 */
"orr r1, r1, #0xc0000000\n" /* 设置为“asynchronous bus mode” */
"mcr p15, 0, r1, c1, c0, 0\n" /* 写入控制寄存器 */
:::"r1");
即可。
4.8
uboot中,将一个外设的寄存器做成一个结构体,做法如下:
typedef struct {
S3C2440_REG32 LOCKTIME;
S3C2440_REG32 MPLLCON;
S3C2440_REG32 UPLLCON;
S3C2440_REG32 CLKCON;
S3C2440_REG32 CLKSLOW;
S3C2440_REG32 CLKDIVN;
S3C2440_REG32 CAMDIVN;
}S3C24X0_CLOCK_POWER;
typedef volatile u32 S3C24X0_REG32;
typedef unsigned int u32;
#define S3C24X0_CLOCK_POWER_BASE 0X4C0000000
static inline * const S3C24X0_GetBase_CLOCK_POWER(void)
{
return (S3C24X0_CLOCK_POWER * const)S3C24X0_CLOCK_POWER_BASE;
}
4.9
io口:在头文件的结构体S3C24X0_GPIO增加:
S3C24X0_REG32 res9;
S3C24X0_REG32 DSC0;
S3C24X0_REG32 DSC1;
S3C24X0_REG32 MSLCON;
S3C24X0_REG32 GPJCON;
S3C24X0_REG32 GPJDAT;
S3C24X0_REG32 GPJUP;
4.10
include/s3c24x0.h的S3C2440_CLOCK_POWER结构末尾添加
S33C24X0_REG32 CAMDIVN
4.11 提示符
include/configs/my2440.h
#define CFG_PROMPT "my2440>#"
4.12
复制s3c2410.h为s3c2440.h,包含s3c2440.h的开关为CONFIG_S3C2440,在my2440.h中定义。
在cpu/arm920t/s3c24x0/目录下的几个.c文件中,增加包含s3c2440.h头文件的CONFIG_S3C2440开关选项。
在rtc目录下的s3c24x0_rtc.c中也同样增加。
将原来的CONFIG_S3C2410取消其定义,还要修改start.S中对应的位置,主要涉及中断和时钟,还有就是结
结构体定义的头文件中要修改。
4.13 sdram的一些参数
sdram:mt48lc16m16a2
字宽:16bit
刷新周期:64ms--->8192行
4bank
每bank:8192行512列16bit
3.3v
烧写后应能从nand或者nor进入uboot。
五: nor完善
nor:en29lv160ab
字宽:16bit
35个扇区
第一个64k字节(32k字(16bit))划分为4个扇区(按字节大小):16k,8k,8k,32k。
后面共31个扇区,每个扇区64k字节
在my2440.h中添加:
#define CONFIG_EON_29LV 1
#ifdef CONFIG_EON_29LV
#define PHYS_FLASH_SIZE 0X200000
#define CFG_MAX_FLASH_SECT (35)
#endif
关掉原用的flash
在flash.h添加制造商id和器件id
#define EON_MANUFACT 0X001C001C
//#define EON_MANUFACT 0X007F007F
#define EON_ID_29LV160ABB 0x22492249
#define EON_ID_29LV160ABT 0x22C422C4
在flash.c的相应位置添加打印厂家:
case (EON_MANUFACT & FLASH_VENDMASK):
printf ("EON: ");
break;
和器件型号:
case (EON_ID_29LV160ABB & FLASH_TYPEMASK):
printf ("1x EON29LV160ABB (16Mbit)\n");
break;
代码。
flinfo查看是否正确。
六.nand驱动
6.1
nand:k9f2g08u0a
字宽:8bit
page:2g 字节
block:64 page
device:2048 block
3.3v
5个周期,
先列后行,
2gbit 共256M字节,
有ecc区域,
需29根地址线,列地址12根,行地址17根
6.2
调用顺序关系:
board.c中start_armboot()会调用nand.c中的nand_init();
--->nand_init_chip(&nand_info[i], &nand_chip[i], base_address[i]);
--->board_nand_init(struct nand_chip *nand);
这个是要实现的,指定nand_chip[]结构中的一些变量:
IO_ADDR_R,IO_ADDR_W,hwcontrol, dev_ready, select_chip, options, eccmode,
读写nand由nand_info[]对应结构体中的相应函数指针确定。
nand_init_chip函数用到的参数:
mtd_info_t nand_inffo[CFG_MAX_NAND_DEVICE];
struct nand_chip nand_chip[CFG_MAX_NAND_DEVICE];
6.3具体移植:
6.3.1
在my2440.h中打开CFG_CMD_NAND
增加:
#define CFG_NAND_BASE 0
#define CFG_MAX_NAND_DEVICE 1
#define NAND_MAX_CHIPS 1
6.3.2 在s3c2440.h中添加
#define S3C2440_NAND_BASE 0x4E000000
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return (S3C2440_NAND * const)S3C2440_NAND_BASE;
}
6.3.3在s3c2440.h中添加
/* NAND FLASH (see S3C2440 manual chapter 6) */
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
S3C24X0_REG32 NFEBLK;
} /*__attribute__((__packed__))*/ S3C2440_NAND;
6.3.4增加文件nand_flash.c,所在位置的Makekfile中COBJS也添加相应目标。
内容:
#include
#if ( (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY))
#include
#include
#define S3C2440_NFSTAT_READY (1<<0)
#define S3C2440_NFCONT_nFCE (1<<1)
static void s3c2440_nand_select_chip(struct mtd_info *mtd, int chip)
{
S3C2440_NAND * const s3c2440nand = S3C2440_GetBase_NAND();
if(chip == -1)
{
s3c2440nand->NFCONT |= S3C2440_NFCONT_nFCE;
}
else
{
s3c2440nand->NFCONT &= ~S3C2440_NFCONT_nFCE;
}
}
static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd)
{
S3C2440_NAND *const s3c2440nand = S3C2440_GetBase_NAND();
struct nand_chip *chip = mtd->priv;
switch(cmd)
{
case NAND_CTL_SETNCE:
case NAND_CTL_CLRNCE:
printf("%s:called for NCE \n", __FUNCTION__);
break;
case NAND_CTL_SETCLE:
chip->IO_ADDR_W = (void *) & s3c2440nand->NFCMD;
break;
case NAND_CTL_SETALE:
chip->IO_ADDR_W = (void *)&s3c2440nand->NFADDR;
break;
default :
chip->IO_ADDR_W = (void *)&s3c2440nand->NFDATA;
break;
}
}
static int s3c2440_nand_devready(struct mtd_info *mtd)
{
S3C2440_NAND *const s3c2440nand = S3C2440_GetBase_NAND();
return (s3c2440nand->NFSTAT & S3C2440_NFSTAT_READY);
}
static void s3c24x0_nand_inithw(void)
{
S3C2440_NAND *const s3c2440nand = S3C2440_GetBase_NAND();
#define TACLS 0
#define TWRPH0 4
#define TWRPH1 2
s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
s3c2440nand->NFCONT=(1<<4)|(0<<1)|(1<<0);
}
void board_nand_init(struct nand_chip *chip)
{
S3C2440_NAND *const s3c2440nand = S3C2440_GetBase_NAND();
s3c24x0_nand_inithw();
chip->IO_ADDR_R = (void *)&s3c2440nand->NFDATA;
chip->IO_ADDR_W = (void *)&s3c2440nand->NFDATA;
chip->hwcontrol = s3c2440_nand_hwcontrol;
chip->dev_ready = s3c2440_nand_devready;
chip->select_chip = s3c2440_nand_select_chip;
chip->options = 0;
chip->eccmode = NAND_ECC_SOFT;
}
#endif
6.4相关:ecc,函数指针,回调函数,qt中使用的信号槽,结构体指定到特定位置及计算其成员的偏移地址,linux内核驱动中结构file_operations的使用
七.usbslave
觉得dnw下载工具挺好用,做一个。
7.1
涉及文件:
start.S ------>在CONFIG_USE_IRQ后面打开中断
s3c24x0.h ---->usb结构体
s3c2440.h ---->中断相关
my2440.h ------> CONFIG_USE_IRQ, CONFIG_USB_DEVICE
usbslave文件
usbslave命令
lib_arm/board.c ------> Port_Init(), usb_init_slave();
lib_arm/armlinux.c ------> 注释udc_disconnect();
7.2
具体移植:
7.2.1.获取usbslave文件,以及cmd_usbslave命令文件
7.2.2.在my2440.h文件中增加CONFIG_USB_DEVICE, CONFIG_USE_IRQ,
下面的可以不用定义CONFIG_CMD_USB, CONFIG_USB_STORAGE, CONFIG_USB_OHCI,CONFIG_DOS_PARTION,CONFIG_CMD_FAT, CONFIG_SUPORT_VFAT
7.2.3.在start.S中的
#ifdef CONFIG_USE_IRQ
.align 5
irq:
后面做修改,:
/*
get_irq_stack
irq_save_user_regs
bl do_irq
irq_restore_user_regs
*/
/* use IRQ for USB and DMA */
sub lr, lr, #4
ldr sp, IRQ_STACK_START
stmdb sp!, {r0-r12, lr}
ldr lr, =int_return
ldr pc, =IRQ_Handle
int_return:
ldmia sp!, {r0-r12, pc}^
7.2.4.在s3c2440.h中增加中断位的定义:
#define _ISR_STARTADDRESS ((unsigned)isr_handle_array)
#define ISR_EINT0_OFT 0
#define ISR_EINT1_OFT 1
#define ISR_EINT2_OFT 2
#define ISR_EINT3_OFT 3
#define ISR_EINT4_7_OFT 4
#define ISR_EINT8_23_OFT 5
#define ISR_NOTUSED6_OFT 6
#define ISR_BAT_FLT_OFT 7
#define ISR_TICK_OFT 8
#define ISR_WDT_OFT 9
#define ISR_TIMER0_OFT 10
#define ISR_TIMER1_OFT 11
#define ISR_TIMER2_OFT 12
#define ISR_TIMER3_OFT 13
#define ISR_TIMER4_OFT 14
#define ISR_UART2_OFT 15
#define ISR_LCD_OFT 16
#define ISR_DMA0_OFT 17
#define ISR_DMA1_OFT 18
#define ISR_DMA2_OFT 19
#define ISR_DMA3_OFT 20
#define ISR_SDI_OFT 21
#define ISR_SPI0_OFT 22
#define ISR_UART1_OFT 23
#define ISR_NOTUSED24_OFT 24
#define ISR_USBD_OFT 25
#define ISR_USBH_OFT 26
#define ISR_IIC_OFT 27
#define ISR_UART0_OFT 28
#define ISR_SPI1_OFT 29
#define ISR_RTC_OFT 30
#define ISR_ADC_OFT 31
子中断:
#define BIT_SUB_ALLMSK (0x7fff)
#define BIT_SUB_AC97 (0x1<<14)
#define BIT_SUB_WDT (0x1<<13)
#define BIT_SUB_CAM_S (0x1<<12) // Added for 2440.
#define BIT_SUB_CAM_C (0x1<<11) // Added for 2440.
#define BIT_SUB_ADC (0x1<<10)
#define BIT_SUB_TC (0x1<<9)
#define BIT_SUB_ERR2 (0x1<<8)
#define BIT_SUB_TXD2 (0x1<<7)
#define BIT_SUB_RXD2 (0x1<<6)
#define BIT_SUB_ERR1 (0x1<<5)
#define BIT_SUB_TXD1 (0x1<<4)
#define BIT_SUB_RXD1 (0x1<<3)
#define BIT_SUB_ERR0 (0x1<<2)
#define BIT_SUB_TXD0 (0x1<<1)
#define BIT_SUB_RXD0 (0x1<<0)
在 PENDING BIT下面添加:
#define BIT_CAM (0x1<<6) // Added for 2440.
#define BIT_NFCON (0x1<<24) // Added for 2440.
修改
#define BIT_WDT (0x1<<9)
为:
#define BIT_WDT_AC97 (0x1<<9)
注释掉内容:
#define ClearPending(bit) {\
rSRCPND = bit;\
rINTPND = bit;\
rINTPND;\
}
7.2.5. 在s3c24x0.h中按手册修改S3C24X0_USB_DEVICE结构体
7.2.6.在lib_arm/board.c的start_armboot()函数中,在enable_interrupts()前添加Port_Init()调用,在后面添加usb_init_slave()调用。
7.2.7.在lib_arm/armlinux.c中注释掉udc_disconnect()函数调用
7.2.8.usbslave放到drivers/usb/slave下,cmd_usbslave放到common下。修改顶层Makefile,添加LIBS += drivers/usb/slave/libusb_slave.a。在common下的Makefile的COBJS后添加添加cmd_usbslave.o
7.2.9.在cpu/arm920t/s3c24x0/interrupts.c中添加函数
int arch_interrupt_init(void)
{
return 0;
}
7.2.10.以上的cmd_usbslave文件及命令文件是在网上下的,中断位相关的定义参照开发板光盘相关文件。
7.2.11.启动可以使用命令usbslave从dnw下载文件。
7.2.12相关:arm异常返回指令,arm异常模式,中断处理过程
八.DM9000
8.1在my2440.h中添加:
#define CONFIG_ETHADDR 08:00:3E:26:0A:5B
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.3
#define CONFIG_SERVERIP 192.168.1.2
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0X20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_NO_SROM 1
在CONFIG_COMMANDS中添加
CFG_CMD_PING | \
完成后用ping命令会出现
could not establish link
提示的mac地址也与设置的不相同
注:CONFIG_IPADDR是开发板的IP地址,CONIG_SERVERIP是电脑IP地址
8.2找到文件为drivers/dm9000x.c
可以在u-boot-1.1.6目录下搜索could not establish link:
grep -nR "could not establish link" *
确定提示错误所在文件
先修改mac地址:
将for(i=0; i<6; i++)
((u16*)bd->bi_enetaddr)[i] = read_srom_word(i);
修改为
char *tmp = getenv("ethaddr")
char *end ;
for(i=0; i<6; i++)
{
bd->bi_enetaddr[i] = tmp?simple_strtoul(tmp, &end, 16) :0;
if(tmp)
tmp=(*end)? end+1 : end;
}
此时mac地址显示的和设置的一致。
注释掉代码:
#if 0
i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
}
}
.......
.......
default:
printf("unknown: %d ", lnk);
break;
}
printf("mode\n");
#endif
设置开发板和主机ip处于同一个网段。
8.3相关: yum在线安装tftp,虚拟机的网络设置,网络层次,tcp/udp,ip地址,路由协议,
十.内核:
源码下载:linux2.6.30.4
下载内核支持yaffs2的补丁:cvs-root.tar.gz
配置文件:采用天嵌提供的配置文件
10.1编译器选择arm-linux-gcc 4.3.3,不要用编译uboot的3.4.5的版本
10.2文件系统yaffs2补丁要打,不然会没有yaffs2的配置选项。
10.3在配置的kernel features中use the arm eabi to compile the kernel和allow old abi binaries to rum with this kerner要选上
10.4启动参数root=mtdblock2表示第三个分区上是文件系统挂接分区,
10.5修改配置:Makefile中的ARCH和CROSS_COMPILE,
机器码和uboot一致,时钟为12000000,nand分区按开发板调整。
10.6将uboot中tools/mkimage拷贝到/bin下,在linux目录中用make uImage编译镜像为uImage。移植的uboot支持uImage,不支持zImage。
10.7相关:uboot中的命令添加及内核中处理器和开发板支持都集中一个段中处理的过程,页表相关(mmu, cache, 协处理器p15等),自修改代码,内核启动过程
十一:yaffs 文件系统
11.1
修改Makefile中ARCH和CROSS_COMPILE,
make menuconfig配置,选定安装位置比如/home/mzk/rootyaffs2,
make install,
11.2
在安装的目录/home/mzk/rootyaffs2下添加proc,dev和etc目录
在dev目录下
mknod console c 5 1
mknod null c 1 3
建立两个结点
在/home/mzk/rootyaffs2/etc下
vim inittab
添加内容
console::askfirst:-/bin/sh
保存退出
mkdir init.d建立目录
vim init.d/rcS
添加内容
mount -t proc none proc
11.3
使用mkyaffs2image工具将/home/mzk/rootyaffs2目录做成yaffs2镜像。
以上是一个简单的文件系统。能完成启动过程。
十二:
部分用到的网站地址:
ftp://ftp.denx.de/pub/u-boot uboot1.1.6下载
ftp://ftp.kernel.org/pub/linux/kernel linux2.6.30.4内核下载
cvs-root.tar.gz补丁,让内核支持yaffs2
busybox-1.18.3.tar.bz2下载
用到的其他一些文件:
uboot编译工具:crosstools_3.4.5_softfloat
yaffs2制作工具:mkyaffs2image(mkxxxximage_tools.tar.bz2)
uboot的usbslave程序文件:uboot-usb_slave.tar.bz2(增加了CONFIG_S3C2440头文件包含条件编译)
uboot的usbslave命令程序: