注意:红色标记为修改的地方
5.1 添加CONFIG_S3C2440条件定义
对于S3C2440,很多代码是借用S3C2410 的,所以要在所有条件编译中有CONFIG_S3C2410 的地方添加CONFIG_S3C2440,这样这些代码才会编译进来。一个简单的方法就是在代码中搜索出所有的CONFIG_S3C2410,并根据实际情况修改。在有些地方不仅要加入CONFIG_S3C2440,还必须根据两个芯片的不同来做出修改,比如PLL的操作代码。对于U-boot-2009.11 的修改如下:
(1) 修改/common/serial.c文件
structserial_device *__default_serial_console (void)
{
………….
return &serial0_device;
#endif
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
#if defined(CONFIG_SERIAL1)
………….
void serial_initialize (void)
{
………….
serial_register(&serial_stuart_device);
#endif
//#if defined(CONFIG_S3C2410)
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
serial_register(&s3c24xx_serial0_device);
serial_register(&s3c24xx_serial1_device);
serial_register(&s3c24xx_serial2_device);
(2) 修改/cpu/arm920t/s3c24x0/interrupts.c文件
#ifdefined(CONFIG_S3C2400)
#include<s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include<s3c2410.h>
(3) 修改/cpu/arm920t/s3c24x0/timer.c文件
#include <common.h>
#if defined(CONFIG_S3C2400) || \
defined(CONFIG_S3C2410) || \
defined(CONFIG_S3C2440) || \
defined(CONFIG_TRAB)
#include <asm/io.h>
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
#include <s3c2410.h>
…………..
ulong get_tbclk(void)
{
ulong tbclk;
#if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)
tbclk =timer_load_val * 100;
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
defined(CONFIG_sunzl2440) || \
defined(CONFIG_VCMA9)
tbclk =CONFIG_SYS_HZ;
#else
……………..
#endif /* defined(CONFIG_S3C2400) ||
defined (CONFIG_S3C2410) ||
defined(CONFIG_S3C2440) ||
defined (CONFIG_TRAB) */
(4) 修改/cpu/arm920t/s3c24x0/usb.c文件
#include<common.h>
#if defined(CONFIG_USB_OHCI_NEW) &&defined(CONFIG_SYS_USB_OHCI_CPU_INIT)
//# if defined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410)
# if defined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#if defined(CONFIG_S3C2400)
# include <s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
# include <s3c2410.h>
(5) 修改/cpu/arm920t/s3c24x0/usb_ohci.c文件
#include<s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
(6) 修改/drivers/i2c/s3c24x0_i2c.c文件
#include<s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include<s3c2410.h>
…………
static int GetI2CSDA(void)
{
struct s3c24x0_gpio*gpio = s3c24x0_get_base_gpio();
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
return(readl(&gpio->GPEDAT) & 0x8000) >> 15;
#endif
………….
static void SetI2CSCL(int x)
{
structs3c24x0_gpio *gpio = s3c24x0_get_base_gpio();
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
writel((readl(&gpio->GPEDAT)& ~0x4000) | (x & 1) << 14, &gpio->GPEDAT);
…………
void i2c_init(int speed, int slaveadd)
{
…………
if ((readl(&i2c->IICSTAT) & I2CSTAT_BSY) ||GetI2CSDA() == 0) {
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
ulongold_gpecon = readl(&gpio->GPECON);
……………
/* bus still busy probably by (most) previouslyinterrupted
transfer */
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
/* setI2CSDA and I2CSCL (GPE15, GPE14) to GPIO */
………….
/* restore pin functions */
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
writel(old_gpecon, &gpio->GPECON);
(7) 修改/drivers/rtc/s3c24x0_rtc.c文件
#ifdefined(CONFIG_S3C2400)
#include <s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
#include <s3c2410.h>
(8) 修改/drivers/serial/serial_s3c24x0.c文件
#include <common.h>
#if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
#include <s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
#include <s3c2410.h>
(9) 修改/drivers/usb/host/ohci-hcd.c文件
#ifdefined(CONFIG_ARM920T) || \
defined(CONFIG_S3C2400) || \
defined(CONFIG_S3C2410) || \
defined(CONFIG_S3C2440) || \
defined(CONFIG_S3C6400) || \
defined(CONFIG_440EP) || \
defined(CONFIG_PCI_OHCI) || \
defined(CONFIG_MPC5200) || \
defined(CONFIG_SYS_OHCI_USE_NPS)
(10)修改/include/common.h文件
#ifdef CONFIG_4xx
ulong get_OPB_freq(void);
ulong get_PCI_freq(void);
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| \
defined(CONFIG_LH7A40X)|| defined(CONFIG_S3C6400) || defined(CONFIG_S3C2440)
ulong get_FCLK(void);
(11)修改/include/serial.h文件
//#if defined(CONFIG_S3C2410)
#ifdefined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
extern struct serial_device s3c24xx_serial0_device;
extern struct serial_device s3c24xx_serial1_device;
extern struct serial_device s3c24xx_serial2_device
(12)修改cpu/arm920t/s3c24x0/speed.c文件
#include<common.h>
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined(CONFIG_S3C2440)
#include <asm/io.h>
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
//#elif defined(CONFIG_S3C2410)
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
……………
static ulong get_PLLCLK(int pllreg)
{
…………
m = ((r &0xFF000) >> 12) + 8;
p = ((r &0x003F0) >> 4) + 2;
s = r &0x3;
//tekkaman
#if defined(CONFIG_S3C2440)
if(pllreg == MPLL)
return((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));
elseif (pllreg == UPLL)
#endif
//tekkaman
return(CONFIG_SYS_CLK_FREQ * m) / (p << s);
}
ulong get_HCLK(void)
{
structs3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
// return(readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
//tekkaman
#if defined(CONFIG_S3C2440)
if(readl(&clk_power->CLKDIVN) & 0x6)
{
if((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
if((readl(&clk_power->CLKDIVN) & 0x6)==6)return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 :get_FCLK()/3);
if((readl(&clk_power->CLKDIVN) & 0x6)==4)return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else return(get_FCLK());
#else
return((readl(&clk_power->CLKDIVN)& 0x2) ? get_FCLK()/2 : get_FCLK());
#endif
//tekkaman
}
…………..
#endif /* defined(CONFIG_S3C2400) ||
defined (CONFIG_S3C2410) ||
defined (CONFIG_S3C2440) ||
defined (CONFIG_TRAB) */
(13)修改include/s3c24x0.h文件
structs3c24x0_interrupt {
S3C24X0_REG32 SRCPND;
S3C24X0_REG32 INTMOD;
S3C24X0_REG32 INTMSK;
S3C24X0_REG32 PRIORITY;
S3C24X0_REG32 INTPND;
S3C24X0_REG32 INTOFFSET;
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 SUBSRCPND;
S3C24X0_REG32 INTSUBMSK;
#endif
};
/* DMAS (see manual chapter 8) */
struct s3c24x0_dma {
S3C24X0_REG32 DISRC;
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 DIDSTC;
………….
S3C24X0_REG32 res[1];
#endif
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 res[7];
…………
struct s3c24x0_clock_power {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
#if defined (CONFIG_S3C2440)
S3C24X0_REG32 CAMDIVN;
#endif
};
struct s3c24x0_lcd {
…………
S3C24X0_REG32 TPAL;
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 LCDINTPND;
…………
#if defined(CONFIG_S3C2410)
/* NAND FLASH (see S3C2410 manual chapter 6) */
struct s3c2410_nand {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFECC;
};
#endif
#if defined (CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6)*/
struct s3c2410_nand {
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;
};
#endif
…………
/* I/O PORT (see manual chapter 9) */
struct s3c24x0_gpio {
…………
S3C24X0_REG32 MISCCR;
S3C24X0_REG32 EXTINT;
#endif
//#ifdef CONFIG_S3C2410
#if defined(CONFIG_S3C2410) ||defined(CONFIG_S3C2440)
S3C24X0_REG32 GPACON;
5.2 修改配置文件include/configs/sunzl2440.h
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
//#define CONFIG_S3C2410 1 /*in a SAMSUNG S3C2410 SoC */
//#define CONFIG_SBC2410X 1 /*on a friendly-arm SBC-2410X Board */
#define CONFIG_S3C2440 1 /*in a SAMSUNG S3C2440 SoC */
#define CONFIG_sunzl2440 1 /*on a friendly-arm sunzl2440 Board */
#define CONFIG_S3C2410_NAND_SKIP_BAD 1
………
#define CONFIG_NET_MULTI
#if 0
#define CONFIG_CS8900 /*we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#define CONFIG_NET_RETRY_COUNT 20
#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_USE_16BIT 1
#define CONFIG_DM9000_NO_SROM 1
#undef CONFIG_DM9000_DEBUG
…………
#include <config_cmd_default.h>
#define CONFIG_CMD_ASKENV
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING
#define CONFIG_CMD_NAND
#define CONFIG_CMD_REGINFO
………….
* Miscellaneous configurable options
*/
#define CONFIG_SYS_LONGHELP /* undef to save memory */
#define CONFIG_SYS_PROMPT "[u-boot@sunzl ]# " /* MonitorCommand Prompt */
#define CONFIG_SYS_CBSIZE 256 /*Console I/O Buffer Size */
#define CONFIG_SYS_PBSIZE(CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
#define CONFIG_SYS_MAXARGS 16 /*max number of command args */
#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* BootArgument Buffer Size */
#define CONFIG_SYS_MEMTEST_START 0x30000000 /*memtest works on */
#define CONFIG_SYS_MEMTEST_END 0x33F00000 /* 63 MB inDRAM */
#define CONFIG_SYS_LOAD_ADDR 0x30008000 /* default load address */
…………….
/* #define CONFIG_AMD_LV400 1 /\* uncomment this if youhave a LV400 flash *\/ */
//#define CONFIG_AMD_LV800 1 /*uncomment this if you have a LV800 flash */
#define CONFIG_EON_29LV160AB 1 //如果nor flash为29LV160AB,则增加此行,不是则注释掉
//#define CONFIG_SST_VF1601 1 //如果nor flash为39VF1601,则增加此行,不是则注释掉
//#define CONFIG_AMD_LV160 1 //如果nor flash为S29AL016,则增加此行,不是则注释
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /*max number of memory banks */
……………
/* timeout values are in ticks */
#define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
#define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Write */
#define CONFIG_ENV_IS_IN_NAND 1
//#define CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_OFFSET 0X60000
#define CONFIG_ENV_SIZE 0x20000 /*Total Size of Environment Sector */
#ifdef CONFIG_EON_29LV160AB //如果定义了29LV160AB
#define PHYS_FLASH_SIZE 0x200000 /*存储器的实际大小2MB*/
#define CONFIG_SYS_MAX_FLASH_SECT (35) /*芯片的页数,也就是扇区数,35个,芯
片资料中有*/
#define CONFIG_ENV_ADDR(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
/*环境变量的存储地址,环境变量的首地址是在CONFIG_ENV_OFFSET处*/
#endif
/* == LENGTH_UBOOT*/
#ifdef CONFIG_SST_VF1601 //如果定义了39VF1601
#define PHYS_FLASH_SIZE 0x00200000 /* 2MB */
#define CONFIG_SYS_MAX_FLASH_SECT (32) /*max number of sectors on one chip */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)/* addr of environment */
#endif
#ifdef CONFIG_AMD_LV160 //如果定义了S29AL016
#define PHYS_FLASH_SIZE 0x00200000 /*芯片大小2MB */
#define CONFIG_SYS_MAX_FLASH_SECT (35) /*扇区数为35 */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)/*环境变量存放地址 */
#endif
/*-----------------------------------------------------------------------
* NAND flashsettings
*/
#if defined(CONFIG_CMD_NAND)
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_NAND_BASE 0x4E000000
#define CONFIG_SYS_MAX_NAND_DEVICE 1 /*Max number of NAND devices */
#define SECTORSIZE 512
#define SECTORSIZE_2K 2048
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_SECTOR_SIZE_2K SECTORSIZE_2K
#define NAND_BLOCK_MASK 511
#define NAND_BLOCK_MASK_2K 2047
#define NAND_MAX_CHIPS 1
#define CONFIG_MTD_NAND_VERIFY_WRITE
#define CONFIG_SYS_64BIT_VSPRINTF /* needed for nand_util.c */
#endif /*CONFIG_CMD_NAND */
所有的修改到此结束
5.3 重新编译并测试
make distclean
make sunzl2440_config
Configuring for sunzl2440board...
make
编译完成后按照前面讲的烧写方法烧到板子上,重启出现如下界面:
U-Boot 2009.11 (Oct 07 2015 - 15:09:27)
sunzl
Love Linuxforever!!
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
*** Warning - bad CRC or NAND, using defaultenvironment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
[ u-boot@sunzl ]#
证明移植成功!!!具体参考U-boot、Kernel、文件系统的几种下载方式总结(基于TQ2440开发板)
http://blog.csdn.net/szl_lxy/article/details/43372257点击打开链接