歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> FL2440的U-boot-2010.09移植(五)uboot架構中NAND FLash驅動修改

FL2440的U-boot-2010.09移植(五)uboot架構中NAND FLash驅動修改

日期:2017/3/1 10:18:21   编辑:Linux編程
uboot代碼中的NAND Flash的讀寫驅動中存在一些錯誤,需要進行修改後才能完成,主要修改drivers/mtd/nand/s3c2410_nand.c文件,首先修改27行如下:
  1. #define NF_BASE 0x4e000000
  2. #if defined(CONFIG_S3C2410)
  3. #define S3C2410_NFCONF_EN (1<<15)
  4. #define S3C2410_NFCONF_512BYTE (1<<14)
  5. #define S3C2410_NFCONF_4STEP (1<<13)
  6. #define S3C2410_NFCONF_INITECC (1<<12)
  7. #define S3C2410_NFCONF_nFCE (1<<11)
  8. #define S3C2410_NFCONF_TACLS(x) ((x)<<8)
  9. #define S3C2410_NFCONF_TWRPH0(x) ((x)<<4)
  10. #define S3C2410_NFCONF_TWRPH1(x) ((x)<<0)
  11. #define S3C2410_ADDR_NALE 4
  12. #define S3C2410_ADDR_NCLE 8
  13. #endif
  14. #if defined(CONFIG_S3C2440)
  15. #define S3C2410_NFCONT_EN (1<<0)
  16. #define S3C2410_NFCONT_INITECC (1<<4)
  17. #define S3C2410_NFCONT_nFCE (1<<1)
  18. #define S3C2410_NFCONT_MAINECCLOCK (1<<5)
  19. #define S3C2410_NFCONF_TACLS(x) ((x)<<12)
  20. #define S3C2410_NFCONF_TWRPH0(x) ((x)<<8)
  21. #define S3C2410_NFCONF_TWRPH1(x) ((x)<<4)
  22. #define S3C2410_ADDR_NALE 0x08
  23. #define S3C2410_ADDR_NCLE 0x0c
  24. #endif

u-boot.2010.09自帶的S3C2410_nand.c的s3c2410_hwcontrol函數有錯。在此函數中,把chip->IO_ADDR_W值改寫了,導致在寫數據時出現錯誤。解決方法是使用一全局變量代替 chip->IO_ADDR_W。在 s3c2410_hwcontrol 函數上一行定義這個全局變量,然後修改 s3c2410_hwcontrol 函數(修改71行),讓它支持 S3C2440,如下:

  1. ulong IO_ADDR_W = NF_BASE;
  2. static void s3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
  3. {
  4. //struct nand_chip *chip = mtd->priv;
  5. struct s3c2410_nand *nand = s3c2410_get_base_nand();
  6. debugX(1, "hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);
  7. if (ctrl & NAND_CTRL_CHANGE) {
  8. //ulong IO_ADDR_W = (ulong)nand;
  9. IO_ADDR_W = (ulong)nand;
  10. if (!(ctrl & NAND_CLE))
  11. IO_ADDR_W |= S3C2410_ADDR_NCLE;
  12. if (!(ctrl & NAND_ALE))
  13. IO_ADDR_W |= S3C2410_ADDR_NALE;
  14. //chip->IO_ADDR_W = (void *)IO_ADDR_W;
  15. #if defined(CONFIG_S3C2410)
  16. if (ctrl & NAND_NCE)
  17. writel(readl(&nand->NFCONF) & ~S3C2410_NFCONF_nFCE,
  18. &nand->NFCONF);
  19. else
  20. writel(readl(&nand->NFCONF) | S3C2410_NFCONF_nFCE,
  21. &nand->NFCONF);
  22. #endif
  23. #if defined(CONFIG_S3C2440)
  24. if (ctrl & NAND_NCE)
  25. writel(readl(&nand->NFCONT) & ~S3C2410_NFCONT_nFCE,
  26. &nand->NFCONT);
  27. else
  28. writel(readl(&nand->NFCONT) | S3C2410_NFCONT_nFCE,
  29. &nand->NFCONT);
  30. #endif
  31. }
  32. if (cmd != NAND_CMD_NONE)
  33. //writeb(cmd, chip->IO_ADDR_W);
  34. writeb(cmd, (void *)IO_ADDR_W);
  35. }

然後修改函數s3c2410_nand_enable_hwecc如下:

  1. void s3c2410_nand_enable_hwecc(struct mtd_info *mtd, int mode)
  2. {
  3. struct s3c2410_nand *nand = s3c2410_get_base_nand();
  4. debugX(1, "s3c2410_nand_enable_hwecc(%p, %d)\n", mtd, mode);
  5. #if defined(CONFIG_S3C2410)
  6. writel(readl(&nand->NFCONF) | S3C2410_NFCONF_INITECC, &nand->NFCONF);
  7. #endif
  8. #if defined(CONFIG_S3C2440)
  9. writel(readl(&nand->NFCONT) | S3C2410_NFCONT_INITECC, &nand->NFCONT);
  10. #endif
  11. }

最後修改board_nand_init 函數如下:

  1. int board_nand_init(struct nand_chip *nand)
  2. {
  3. u_int32_t cfg;
  4. u_int8_t tacls, twrph0, twrph1;
  5. struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
  6. struct s3c2410_nand *nand_reg = s3c2410_get_base_nand();
  7. debugX(1, "board_nand_init()\n");
  8. writel(readl(&clk_power->CLKCON) | (1 << 4), &clk_power->CLKCON);
  9. #if defined(CONFIG_S3C2410)
  10. /* initialize hardware */
  11. twrph0 = 3;
  12. twrph1 = 0;
  13. tacls = 0;
  14. cfg = S3C2410_NFCONF_EN;
  15. cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
  16. cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
  17. cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
  18. writel(cfg, &nand_reg->NFCONF);
  19. /* initialize nand_chip data structure */
  20. nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;
  21. #endif
  22. #if defined(CONFIG_S3C2440)
  23. /* initialize hardware */
  24. tacls = 0;
  25. twrph0 = 4;
  26. twrph1 = 2;
  27. cfg = 0;
  28. cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
  29. cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
  30. cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
  31. writel(cfg, &nand_reg->NFCONF);
  32. cfg = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1<<0);
  33. writel(cfg, &nand_reg->NFCONT);
  34. /* initialize nand_chip data structure */
  35. nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;
  36. #endif
  37. nand->select_chip = NULL;
  38. ……

相關閱讀:

U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

FL2440的U-boot-2010.09移植(一)http://www.linuxidc.com/Linux/2012-06/63755.htm
FL2440的U-boot-2010.09移植(二)http://www.linuxidc.com/Linux/2012-06/63756.htm
FL2440的U-boot-2010.09移植(三)DM9000網卡及開發板相關配置 http://www.linuxidc.com/Linux/2012-07/64155.htm
FL2440的U-boot-2010.09移植(四) 添加NOR FLash啟動支持 http://www.linuxidc.com/Linux/2012-07/64156.htm
FL2440的U-boot-2010.09移植(五)uboot架構中NAND FLash驅動修改 http://www.linuxidc.com/Linux/2012-07/64157.htm
FL2440的U-boot-2010.09移植(六)NAND FLash啟動支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
FL2440的U-boot-2010.09移植(七)LCD的支持 http://www.linuxidc.com/Linux/2012-07/641587.htm
針對FL2440開發板的u-boot-2010.09版本補丁 http://www.linuxidc.com/Linux/2012-07/64116.htm

Copyright © Linux教程網 All Rights Reserved