- 论坛徽章:
- 0
|
Tekkamanninja的移植过程:
1. board目录
board目录下添加一个目录tekkamanninja\mini2440
2. 修改Makefile
找到:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
参照smdk2410的配置,添加如下两行:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 tekkamanninja s3c24x0
采用的CPU是arm,arm内核是arm920t,
3. common
common
cmd_load.c
有两种modem模式,一种是xmodem,一种是ymodem。
涉及到宏定义 ENABLE_CMD_LOADB_X
添加了一条命令 loadx,对应是xmodem,
对应loadx命令,执行load_serial_xmodem函数。
cmd_mem.c
涉及到宏定义CONFIG_CMD_MMC
cmd_mmc.c
将do_mmc函数中的,
if (mmc_legacy_init(dev) != 0) {
puts("No MMC card found\n");
return 1;
}
修改为:
if (mmc_init(dev) != 0) {
puts("No MMC card found\n");
return 1;
}
cmd_nand.c
涉及到宏定义ENABLE_CMD_NAND_YAFFS
在do_nand函数中添加了:
nand write yaffs| yaffs1,但是不支持nand read.yaffs|yaffs1。
serial.c
涉及到宏定义CONFIG_S3C2440,
由于s3c2410和s3c2440采用相同的串口配置,所以修改如下内容:
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
即有CONFIG_S3C2410的地方,都增加了CONFIG_S3C2440。
4. cpu
由于s3c2410和s3c2440都是arm920t架构,进行如下修改:
\arm920t\s3c24x0\interrupts.c
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
\arm920t\s3c24x0\mmc.c --- 添加
u-boot S3C2410 MMC/SD card driver
\arm920t\s3c24x0\Makefile
由于添加了MMC/SD card的驱动,所以需要多编译mmc.o
COBJS-y += mmc.o
\arm920t\s3c24x0\speed.c
主要s3c2440的MPLL时钟计算公式和HCLK改变了,需要修改get_PLLCLK和get_HCLK函数,但是s3c2440和s3c2410的UPLL是一样的。
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
static ulong get_PLLCLK(int pllreg)
{
…
//tekkaman
#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p
else if (pllreg == UPLL)
#endif
//tekkaman
return((CONFIG_SYS_CLK_FREQ * m) / (p
}
/* return HCLK frequency */
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
//tekkaman
#if defined(CONFIG_S3C2440)
if (clk_power->CLKDIVN & 0x6)
{
if ((clk_power->CLKDIVN & 0x6)==2) return(get_FCLK()/2);
if ((clk_power->CLKDIVN & 0x6)==6) return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((clk_power->CLKDIVN & 0x6)==4) return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else return(get_FCLK());
#else
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
#endif
//tekkaman
}
\arm920t\s3c24x0\timer.c
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
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_MINI2440) || \
defined(CONFIG_VCMA9)
tbclk = CONFIG_SYS_HZ;
#else
# error "tbclk not configured"
#endif
return tbclk;
}
\arm920t\s3c24x0\usb.c
# if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
\arm920t\s3c24x0\usb_ohci.c
#elif defined(CONFIG_S3C2410)|| defined (CONFIG_S3C2440)
\arm920t\config.mk
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8
# -msoft-float
\arm920t\start.S
这个文件改动比较大,需要好好分析!
5. drivers
\i2c\s3c24x0_i2c.c
这个文件其实s3c2410和s3c2440几乎完全一样,主要搞清楚I2C由哪个GPIO口控制即可。
\mtd\nand\nand_base.c
修改了nand_write函数,针对宏定义ENABLE_CMD_NAND_YAFFS
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const uint8_t *buf)
{
struct nand_chip *chip = mtd->priv;
int ret;
#if defined(ENABLE_CMD_NAND_YAFFS)
/*Thanks for hugerat's code!*/
int oldopsmode = 0;
if(mtd->rw_oob==1) {
size_t oobsize = mtd->oobsize;
size_t datasize = mtd->writesize;
int i = 0;
uint8_t oobtemp[oobsize];
int datapages = 0;
datapages = len/(datasize);
for(i=0;i {
memcpy((void *)oobtemp,
(void *)(buf+datasize*(i+1)),
oobsize);
memmove((void *)(buf+datasize*(i+1)),
(void *)(buf+datasize*(i+1)+oobsize),
(datapages-(i+1))*(datasize)+(datapages-1)*oobsize);
memcpy((void *)(buf+(datapages)*(datasize+oobsize)-oobsize),
(void *)(oobtemp),
oobsize);
}
}
#endif
/* Do not allow reads past end of device */
if ((to + len) > mtd->size)
return -EINVAL;
if (!len)
return 0;
nand_get_device(chip, mtd, FL_WRITING);
chip->ops.len = len;
chip->ops.datbuf = (uint8_t *)buf;
#if defined(ENABLE_CMD_NAND_YAFFS)
/*Thanks for hugerat's code!*/
if(mtd->rw_oob!=1) {
chip->ops.oobbuf = NULL;
} else {
chip->ops.oobbuf = (uint8_t *)(buf+len);
chip->ops.ooblen = mtd->oobsize;
oldopsmode = chip->ops.mode;
chip->ops.mode = MTD_OOB_RAW;
}
#else
chip->ops.oobbuf = NULL;
#endif
ret = nand_do_write_ops(mtd, to, &chip->ops);
*retlen = chip->ops.retlen;
nand_release_device(mtd);
#if defined(ENABLE_CMD_NAND_YAFFS)
/*Thanks for hugerat's code!*/
chip->ops.mode = oldopsmode;
#endif
return ret;
}
\mtd\nand\nand_util.c
主要修改了nand_write_skip_bad函数,针对宏定义ENABLE_CMD_NAND_YAFFS
int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
u_char *buffer)
{
int rval;
size_t left_to_write = *length;
size_t len_incl_bad;
u_char *p_buffer = buffer;
#if defined(ENABLE_CMD_NAND_YAFFS)
if(nand->rw_oob==1) {
size_t oobsize = nand->oobsize;
size_t datasize = nand->writesize;
int datapages = 0;
if (((*length)%(nand->oobsize+nand->writesize)) != 0) {
printf ("Attempt to write error length data!\n");
return -EINVAL;
}
datapages = *length/(datasize+oobsize);
*length = datapages*datasize;
left_to_write = *length;
// nand->skipfirstblock=1;
}
#endif
/* Reject writes, which are not page aligned */
if ((offset & (nand->writesize - 1)) != 0 ||
(*length & (nand->writesize - 1)) != 0) {
printf ("Attempt to write non page aligned data\n");
return -EINVAL;
}
len_incl_bad = get_len_incl_bad (nand, offset, *length);
if ((offset + len_incl_bad) >= nand->size) {
printf ("Attempt to write outside the flash area\n");
return -EINVAL;
}
#if !defined(ENABLE_CMD_NAND_YAFFS)
if (len_incl_bad == *length) {
rval = nand_write (nand, offset, length, buffer);
if (rval != 0)
printf ("NAND write to offset %llx failed %d\n",
offset, rval);
return rval;
}
#endif
while (left_to_write > 0) {
size_t block_offset = offset & (nand->erasesize - 1);
size_t write_size;
WATCHDOG_RESET ();
if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
printf ("Skip bad block 0x%08llx\n",
offset & ~(nand->erasesize - 1));
offset += nand->erasesize - block_offset;
continue;
}
#if defined(ENABLE_CMD_NAND_YAFFS)
/*Thanks for hugerat's code*/
if(nand->skipfirstblk==1) {
nand->skipfirstblk=0;
printf ("Skip the first good block %llx\n",
offset & ~(nand->erasesize - 1));
offset += nand->erasesize - block_offset;
continue;
}
#endif
if (left_to_write erasesize - block_offset))
write_size = left_to_write;
else
write_size = nand->erasesize - block_offset;
printf("\rWriting at 0x%llx -- ",offset); /*Thanks for hugerat's code*/
rval = nand_write (nand, offset, &write_size, p_buffer);
if (rval != 0) {
printf ("NAND write to offset %llx failed %d\n",
offset, rval);
*length -= left_to_write;
return rval;
}
left_to_write -= write_size;
printf("%d%% is complete.",100-(left_to_write/(*length/100)));/*Thanks for hugerat's code*/
offset += write_size;
#if defined(ENABLE_CMD_NAND_YAFFS)
/*Thanks for hugerat's code*/
if(nand->rw_oob==1) {
p_buffer += write_size+(write_size/nand->writesize*nand->oobsize);
} else {
p_buffer += write_size;
}
#else
p_buffer += write_size;
#endif
}
return 0;
}
\mtd\nand\s3c2410_nand.c
主要修改了一些s3c2440的nand flash控制寄存器地址,
主要是分清楚如下两个寄存器:
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGb(NF_BASE + 0x4)
\net\dm9000x.c
此处修改关系不大,
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 1650) {
// printf("could not establish link\n");
// return 0;
break;
}
}
\rtc\s3c24x0_rtc.c
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
\serial\serial_s3c24x0.c
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
\usb\host\ohci-hcd.c
#if defined(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)
# define OHCI_USE_NPS /* force NoPowerSwitching mode */
#endif
\vedio\cfb_console.c
修改了一下长度和宽度
#define VIDEO_INFO_X (0)
#define VIDEO_INFO_Y (VIDEO_LOGO_HEIGHT)
//#define VIDEO_INFO_X (VIDEO_LOGO_WIDTH)
//#define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2)
\vedio\Makefile
COBJS-y += s3c2410_fb.o
\vedio\s3c2410_fb.c --- 添加
实际上只有一个函数,video_hw_init
\vedio\videomodes.c
由于我们采用的液晶屏分辨率是240x320的,所以这里也要修改一下,
const struct ctfb_vesa_modes vesa_modes[VESA_MODES_COUNT] = {
{0x301, RES_MODE_640x480, 8},
{0x310, RES_MODE_640x480, 15},
{0x311, RES_MODE_640x480, 16},
{0x312, RES_MODE_640x480, 24},
{0x303, RES_MODE_800x600, 8},
{0x313, RES_MODE_800x600, 15},
{0x314, RES_MODE_800x600, 16},
{0x315, RES_MODE_800x600, 24},
{0x305, RES_MODE_1024x768, 8},
{0x316, RES_MODE_1024x768, 15},
{0x317, RES_MODE_1024x768, 16},
{0x318, RES_MODE_1024x768, 24},
{0x161, RES_MODE_1152x864, 8},
{0x162, RES_MODE_1152x864, 15},
{0x163, RES_MODE_1152x864, 16},
{0x307, RES_MODE_1280x1024, 8},
{0x319, RES_MODE_1280x1024, 15},
{0x31A, RES_MODE_1280x1024, 16},
{0x31B, RES_MODE_1280x1024, 24},
{0x211, RES_MODE_240x320, 16},
};
const struct ctfb_res_modes res_mode_init[RES_MODES_COUNT] = {
/* x y pixclk le ri up lo hs vs s vmode */
{640, 480, 39721, 40, 24, 32, 11, 96, 2, 0, FB_VMODE_NONINTERLACED},
{800, 600, 27778, 64, 24, 22, 1, 72, 2, 0, FB_VMODE_NONINTERLACED},
{1024, 768, 15384, 168, 8, 29, 3, 144, 4, 0, FB_VMODE_NONINTERLACED},
{960, 720, 13100, 160, 40, 32, 8, 80, 4, 0, FB_VMODE_NONINTERLACED},
{1152, 864, 12004, 200, 64, 32, 16, 80, 4, 0, FB_VMODE_NONINTERLACED},
{1280, 1024, 9090, 200, 48, 26, 1, 184, 3, 0, FB_VMODE_NONINTERLACED},
{240, 320, 158025, 26, 6, 1, 11, 37, 2, 0, FB_VMODE_NONINTERLACED},
};
\vedio\videomodes.h
有了videomodes.c中的修改,这里需要配置一下,
#ifndef CFG_SYS_DEFAULT_VIDEO_MODE
#define CFG_SYS_DEFAULT_VIDEO_MODE 0x211
#endif
#define RES_MODE_640x480 0
#define RES_MODE_800x600 1
#define RES_MODE_1024x768 2
#define RES_MODE_960_720 3
#define RES_MODE_1152x864 4
#define RES_MODE_1280x1024 5
#define RES_MODE_240x320 6
#define RES_MODES_COUNT 7
#define VESA_MODES_COUNT 20
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/111832/showart_2181982.html |
|