前段时间去韩国开会,一直没时间更新,现在继续。前面三个部分已将u-boot启动第一阶段的内容讲述完毕,现在进入启动的第二阶段。由于第二阶段采用C语言编写,在此之前首先介绍以下头文件的更改。
- include/s3c24x0.h
- include/s3c2440.h(新文件,以s3c2410.h为基础移植)
- include/configs/mini2440.h(新文件,以smdk2410.h为基础移植)
本篇仅涉及include/s3c24x0.h,其余两个文件将在后续博文中介绍。
- 中断控制寄存器结构体:添加对S3C2440的支持
源代码:
/* INTERRUPT (see manual chapter 14) */
typedef struct {
S3C24X0_REG32 SRCPND;
S3C24X0_REG32 INTMOD;
S3C24X0_REG32 INTMSK;
S3C24X0_REG32 PRIORITY;
S3C24X0_REG32 INTPND;
S3C24X0_REG32 INTOFFSET;
#ifdef CONFIG_S3C2410
S3C24X0_REG32 SUBSRCPND;
S3C24X0_REG32 INTSUBMSK;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_INTERRUPT;
更改为:
/* INTERRUPT (see manual chapter 14) */
typedef struct {
S3C24X0_REG32 SRCPND;
S3C24X0_REG32 INTMOD;
S3C24X0_REG32 INTMSK;
S3C24X0_REG32 PRIORITY;
S3C24X0_REG32 INTPND;
S3C24X0_REG32 INTOFFSET;
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 SUBSRCPND;
S3C24X0_REG32 INTSUBMSK;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_INTERRUPT;
源代码:
/* DMAS (see manual chapter 8) */
typedef struct {
S3C24X0_REG32 DISRC;
#ifdef CONFIG_S3C2410
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
#ifdef CONFIG_S3C2410
S3C24X0_REG32 DIDSTC;
#endif
S3C24X0_REG32 DCON;
S3C24X0_REG32 DSTAT;
S3C24X0_REG32 DCSRC;
S3C24X0_REG32 DCDST;
S3C24X0_REG32 DMASKTRIG;
#ifdef CONFIG_S3C2400
S3C24X0_REG32 res[1];
#endif
#ifdef CONFIG_S3C2410
S3C24X0_REG32 res[7];
#endif
} /*__attribute__((__packed__))*/ S3C24X0_DMA;
更改为:
/* DMAS (see manual chapter 8) */
typedef struct {
S3C24X0_REG32 DISRC;
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 DIDSTC;
#endif
S3C24X0_REG32 DCON;
S3C24X0_REG32 DSTAT;
S3C24X0_REG32 DCSRC;
S3C24X0_REG32 DCDST;
S3C24X0_REG32 DMASKTRIG;
#ifdef CONFIG_S3C2400
S3C24X0_REG32 res[1];
#endif
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 res[7];
#endif
} /*__attribute__((__packed__))*/ S3C24X0_DMA;
源代码:
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
更改为:
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
#ifdef CONFIG_S3C2440
S3C24X0_REG32 CAMDIVN;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
源代码:
/* LCD CONTROLLER (see manual chapter 15) */
typedef struct {
S3C24X0_REG32 LCDCON1;
S3C24X0_REG32 LCDCON2;
S3C24X0_REG32 LCDCON3;
S3C24X0_REG32 LCDCON4;
S3C24X0_REG32 LCDCON5;
S3C24X0_REG32 LCDSADDR1;
S3C24X0_REG32 LCDSADDR2;
S3C24X0_REG32 LCDSADDR3;
S3C24X0_REG32 REDLUT;
S3C24X0_REG32 GREENLUT;
S3C24X0_REG32 BLUELUT;
S3C24X0_REG32 res[8];
S3C24X0_REG32 DITHMODE;
S3C24X0_REG32 TPAL;
#ifdef CONFIG_S3C2410
S3C24X0_REG32 LCDINTPND;
S3C24X0_REG32 LCDSRCPND;
S3C24X0_REG32 LCDINTMSK;
S3C24X0_REG32 LPCSEL;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_LCD;
更改后:
/* LCD CONTROLLER (see manual chapter 15) */
typedef struct {
S3C24X0_REG32 LCDCON1;
S3C24X0_REG32 LCDCON2;
S3C24X0_REG32 LCDCON3;
S3C24X0_REG32 LCDCON4;
S3C24X0_REG32 LCDCON5;
S3C24X0_REG32 LCDSADDR1;
S3C24X0_REG32 LCDSADDR2;
S3C24X0_REG32 LCDSADDR3;
S3C24X0_REG32 REDLUT;
S3C24X0_REG32 GREENLUT;
S3C24X0_REG32 BLUELUT;
S3C24X0_REG32 res[8];
S3C24X0_REG32 DITHMODE;
S3C24X0_REG32 TPAL;
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 LCDINTPND;
S3C24X0_REG32 LCDSRCPND;
S3C24X0_REG32 LCDINTMSK;
S3C24X0_REG32 LPCSEL;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_LCD;
S3C2440的NAND Flash寄存器与S3C2410相差较大,这里重新编写如下:
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;
CMOS摄像头控制器是S3C2440新增的,因此需要增加如下代码:
/* Camera (see s3c2440 manual chapter 23) */
typedef struct{
S3C24X0_REG32 CISRCFMT;
S3C24X0_REG32 CIWDOFST;
S3C24X0_REG32 CIGCTRL;
S3C24X0_REG32 res0[3];
S3C24X0_REG32 CICOYSA[4];
S3C24X0_REG32 CICOCBSA[4];
S3C24X0_REG32 CICOCRSA[4];
S3C24X0_REG32 CICOTRGFMT;
S3C24X0_REG32 CICOCTRL;
S3C24X0_REG32 CICOSCPRERATIO;
S3C24X0_REG32 CICOSCPREDST;
S3C24X0_REG32 CICOSCCTRL;
S3C24X0_REG32 CICOTAREA;
S3C24X0_REG32 res1;
S3C24X0_REG32 CICOSTATUS;
S3C24X0_REG32 res2;
S3C24X0_REG32 CIPRCLRSA[4];
S3C24X0_REG32 CIPRTRGFMT;
S3C24X0_REG32 CIPRCTRL;
S3C24X0_REG32 CIPRSCPRERATIO;
S3C24X0_REG32 CIPRSCPREDST;
S3C24X0_REG32 CIPRSCCTRL;
S3C24X0_REG32 CIPRTAREA;
S3C24X0_REG32 res3;
S3C24X0_REG32 CIPRSTATUS;
S3C24X0_REG32 res4;
S3C24X0_REG32 CIIMGCPT;
}/*__attribute__((__packed__))*/ S3C2440_CAM;
源代码:
/* IIC (see manual chapter 20) */
typedef struct {
S3C24X0_REG32 IICCON;
S3C24X0_REG32 IICSTAT;
S3C24X0_REG32 IICADD;
S3C24X0_REG32 IICDS;
} /*__attribute__((__packed__))*/ S3C24X0_I2C;
修改后:
/* IIC (see manual chapter 20) */
typedef struct {
S3C24X0_REG32 IICCON;
S3C24X0_REG32 IICSTAT;
S3C24X0_REG32 IICADD;
S3C24X0_REG32 IICDS;
#ifdef CONFIG_S3C2440
S3C24X0_REG32 IICLC;
#endif
} /*__attribute__((__packed__))*/ S3C24X0_I2C;
S3C2440的I/O寄存器与S3C2410基本相同,由于多出一些引脚,因此I/O控制寄存器也多出一些。因此在S3C24X0_GPIO结构中新增如下代码:
#ifdef CONFIG_S3C2440
S3C24X0_REG32 GPACON;
S3C24X0_REG32 GPADAT;
S3C24X0_REG32 res1[2];
S3C24X0_REG32 GPBCON;
S3C24X0_REG32 GPBDAT;
S3C24X0_REG32 GPBUP;
S3C24X0_REG32 res2;
S3C24X0_REG32 GPCCON;
S3C24X0_REG32 GPCDAT;
S3C24X0_REG32 GPCUP;
S3C24X0_REG32 res3;
S3C24X0_REG32 GPDCON;
S3C24X0_REG32 GPDDAT;
S3C24X0_REG32 GPDUP;
S3C24X0_REG32 res4;
S3C24X0_REG32 GPECON;
S3C24X0_REG32 GPEDAT;
S3C24X0_REG32 GPEUP;
S3C24X0_REG32 res5;
S3C24X0_REG32 GPFCON;
S3C24X0_REG32 GPFDAT;
S3C24X0_REG32 GPFUP;
S3C24X0_REG32 res6;
S3C24X0_REG32 GPGCON;
S3C24X0_REG32 GPGDAT;
S3C24X0_REG32 GPGUP;
S3C24X0_REG32 res7;
S3C24X0_REG32 GPHCON;
S3C24X0_REG32 GPHDAT;
S3C24X0_REG32 GPHUP;
S3C24X0_REG32 res8;
S3C24X0_REG32 MISCCR;
S3C24X0_REG32 DCLKCON;
S3C24X0_REG32 EXTINT0;
S3C24X0_REG32 EXTINT1;
S3C24X0_REG32 EXTINT2;
S3C24X0_REG32 EINTFLT0;
S3C24X0_REG32 EINTFLT1;
S3C24X0_REG32 EINTFLT2;
S3C24X0_REG32 EINTFLT3;
S3C24X0_REG32 EINTMASK;
S3C24X0_REG32 EINTPEND;
S3C24X0_REG32 GSTATUS0;
S3C24X0_REG32 GSTATUS1;
S3C24X0_REG32 GSTATUS2;
S3C24X0_REG32 GSTATUS3;
S3C24X0_REG32 GSTATUS4;
S3C24X0_REG32 res9[3];
S3C24X0_REG32 MSLCON;
S3C24X0_REG32 GPJCON;
S3C24X0_REG32 GPJDAT;
S3C24X0_REG32 GPJUP;
#endif
typedef struct{
S3C24X0_REG32 ADCCON;
S3C24X0_REG32 ADCTSC;
S3C24X0_REG32 ADCDLY;
S3C24X0_REG32 ADCDAT0;
S3C24X0_REG32 ADCDAT1;
S3C24X0_REG32 ADCUPDN;
} /*__attribute__((__packed__))*/ S3C2440_ADC;
S3C2440中SD卡控制寄存器为新增部分,需要添加如下代码:
* SD INTERFACE (see S3C2440 manual chapter 19) */
typedef struct {
S3C24X0_REG32 SDICON;
S3C24X0_REG32 SDIPRE;
S3C24X0_REG32 SDICARG;
S3C24X0_REG32 SDICCON;
S3C24X0_REG32 SDICSTA;
S3C24X0_REG32 SDIRSP0;
S3C24X0_REG32 SDIRSP1;
S3C24X0_REG32 SDIRSP2;
S3C24X0_REG32 SDIRSP3;
S3C24X0_REG32 SDIDTIMER;
S3C24X0_REG32 SDIBSIZE;
S3C24X0_REG32 SDIDCON;
S3C24X0_REG32 SDIDCNT;
S3C24X0_REG32 SDIDSTA;
S3C24X0_REG32 SDIFSTA;
S3C24X0_REG32 SDIIMSK;
#ifdef __BIG_ENDIAN
S3C24X0_REG8 res[3];
S3C24X0_REG8 SDIDAT;
#else
S3C24X0_REG8 SDIDAT;
S3C24X0_REG8 res[3];
#endif
} /*__attribute__((__packed__))*/ S3C2440_SDI;
AC97控制寄存器为S3C2440新增部分,需添加如下代码:
/* AC97 (see S3C2440 manual chapter 24) */
typedef struct{
S3C24X0_REG32 AC_GLBCTRL;
S3C24X0_REG32 AC_GLBSTAT;
S3C24X0_REG32 AC_CODEC_CMD;
S3C24X0_REG32 AC_CODEC_STAT;
S3C24X0_REG32 AC_PCMADDR;
S3C24X0_REG32 AC_MICADDR;
S3C24X0_REG32 AC_PCMDATA;
S3C24X0_REG32 AC_MICDATA;
} /*__attribute__((__packed__))*/ S3C2440_AC97;
至此,s3c24x0.h文件的移植工作已经全部结束。可以看出s3c24x0.h文件主要用于定义片上控制寄存器的结构体,掌握这一原则后,移植工作也就变得很容易。只需将S3C2440相对于初始代码中未定义的部分添加上即可。为保证移植后代码的通用性,建议如本文一样采用条件编译宏进行控制。保证移植后依然对S3C24x0其余SOC的支持,养成良好的软件设计习惯。
- include/s3c24x0.h
- 中断寄存器结构体:增加对S3C2440的支持,寄存器与S3C2410一致
- DMA寄存器结构体:增加对S3C2440的支持,寄存器与S3C2410一致
- 时钟与能量管理寄存器结构体:增加对S3C2440的支持。
- LCD控制寄存器结构体:增加对S3C2440的支持,寄存器与S3C2410一致
- 增加S3C2440的NAND Flash控制寄存器结构体
- 增加CMOS摄像头控制寄存器的支持
- IIC控制寄存器结构体:增加对S3C2440的支持
- I/O寄存器结构体:增加对S3C2440的支持
- ADC寄存器结构体:增加S3C2440的支持
- 增加对SD卡控制器的支持
- 增加AC97控制寄存器结构体
- 小结