免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2559 | 回复: 0
打印 上一主题 下一主题

u-boot-2009.08移植到micro2440(128MB)笔记(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-15 10:17 |只看该作者 |倒序浏览

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP