友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(四)
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(四)
zhaowei09 发表于2年前
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(四)
  • 发表于 2年前
  • 阅读 7
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

前段时间去韩国开会,一直没时间更新,现在继续。前面三个部分已将u-boot启动第一阶段的内容讲述完毕,现在进入启动的第二阶段。由于第二阶段采用C语言编写,在此之前首先介绍以下头文件的更改。

  1. include/s3c24x0.h
  2. include/s3c2440.h(新文件,以s3c2410.h为基础移植)
  3. 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的支持,养成良好的软件设计习惯。

  1. 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控制寄存器结构体
    • 小结
  2.  

 

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 7
码字总数 45754
×
zhaowei09
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: