boot移植(十一)---代码修改---支持nandflash

发布者:EternalSmile最新更新时间:2024-07-15 来源: elecfans关键字:boot  移植 手机看文章 扫描二维码
随时随地手机看文章

一、移植前的修改

1.1 include/configs/jz2440修改

原来的定义:


可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash。

这个在我们文件中的82行有定义,所以不需要定义了。

  

将里面的S3C2410全部改为S3C2440:


1.2 drivers/mtd/nand/修改

拷贝s3c2410_nand.c 成  s3c2440_nand.c


在此目录的makefile中添加 s3c2440_nand.c

  

修改s3c2440_nand.c 文件,从board_nand_init 逐行检测修改,代码如下:


  1 #include

  2 

  3 #include

  4 #include

  5 #include

  6 

  7 /* NFCONF 寄存器定义 */

  8 #define S3C2440_NFCONF_EN          (1<<15)

  9 #define S3C2440_NFCONF_512BYTE     (1<<14)

 10 #define S3C2440_NFCONF_4STEP       (1<<13)

 11 #define S3C2440_NFCONF_INITECC     (1<<12)

 12 #define S3C2440_NFCONF_nFCE        (1<<1)

 13 #define S3C2440_NFCONF_TACLS(x)    ((x)<<12)

 14 #define S3C2440_NFCONF_TWRPH0(x)   ((x)<<8)

 15 #define S3C2440_NFCONF_TWRPH1(x)   ((x)<<4)

 16 

 17 /* NFCONF 寄存器定义 */

 18 #define S3C2440_NFCONT_LOCKTIGHT                  (1<<13)

 19 #define S3C2440_NFCONT_SOFTLOCK                  (1<<12)

 20 #define S3C2440_NFCONT_ENLLLEGALINT              (1<<10)

 21 #define S3C2440_NFCONT_ENRnBINT                 (1<<9)

 22 #define S3C2440_NFCONT_Rn                         (1<<8)

 23 #define S3C2440_NFCONT_SPAREECCLOCK             (1<<6)

 24 #define S3C2440_NFCONT_MAINECCLOCK                 (1<<5)

 25 #define S3C2440_NFCONT_ECC                      (1<<4)

 26 #define S3C2440_NFCONT_nCE                      (1<<1)

 27 #define S3C2440_NFCONT_MODE                      (1<<0)

 28 

 29 

 30 

 31 

 32 #define S3C2440_ADDR_NALE 4

 33 #define S3C2440_ADDR_NCLE 8

 34 

 35 #ifdef CONFIG_NAND_SPL

 36 

 37 /* in the early stage of NAND flash booting, printf() is not available */

 38 #define printf(fmt, args...)

 39 

 40 static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)

 41 {

 42     int i;

 43     struct nand_chip *this = mtd->priv;

 44 

 45     for (i = 0; i < len; i++)

 46         buf[i] = readb(this->IO_ADDR_R);

 47 }

 48 #endif

 49 

 50 /* ctrl:表示做什么,选中芯片/取消片选,是发命令还是发地址

 51  * cmd :命令值或地址值

 52  */

 53 static void s3c24x0_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)

 54 {

 55     struct s3c24x0_nand *nand = s3c24x0_get_base_nand();

 56 

 57     debug('hwcontrol(): 0x%02x 0x%02xn', cmd, ctrl);

 58 

 59     if (ctrl & NAND_CLE) {

 60         /* 发命令 */

 61         writeb(cmd, &nand->nfcmd);

 62     }

 63     else if (ctrl & NAND_ALE) {

 64         /* 发地址 */

 65         writeb(cmd, &nand->nfaddr);

 66     }

 67 

 68 }

 69 

 70 /**

 71  * nand_select_chip - [DEFAULT] control CE line

 72  * @mtd: MTD device structure

 73  * @chipnr: chipnumber to select, -1 for deselect

 74  *

 75  * Default select function for 1 chip devices.

 76  */

 77 void s3c2440_nand_select(struct mtd_info *mtd, int chipnr)

 78 {

 79     struct s3c24x0_nand *nand = s3c24x0_get_base_nand();

 80 

 81     switch (chipnr) {

 82     case -1: /* 取消选中 */

 83         nand->nfcont |= S3C2440_NFCONT_nCE;

 84         break;

 85     case 0: /* 选中 */

 86         nand->nfcont &= ~S3C2440_NFCONT_nCE;

 87         break;

 88 

 89     default:

 90         BUG();

 91     }

 92 }

 93 

 94 static int s3c24x0_dev_ready(struct mtd_info *mtd)

 95 {

 96     struct s3c24x0_nand *nand = s3c24x0_get_base_nand();

 97     debug('dev_readyn');

 98     return readl(&nand->nfstat) & 0x01;

 99 }

100 

101 #ifdef CONFIG_S3C2440_NAND_HWECC

102 void s3c24x0_nand_enable_hwecc(struct mtd_info *mtd, int mode)

103 {

104     struct s3c24x0_nand *nand = s3c24x0_get_base_nand();

105     debug('s3c24x0_nand_enable_hwecc(%p, %d)n', mtd, mode);

106     writel(readl(&nand->nfconf) | S3C2440_NFCONF_INITECC, &nand->nfconf);

107 }

108 

109 static int s3c24x0_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,

110                       u_char *ecc_code)

111 {

112     struct s3c24x0_nand *nand = s3c24x0_get_base_nand();

113     ecc_code[0] = readb(&nand->nfecc);

114     ecc_code[1] = readb(&nand->nfecc + 1);

115     ecc_code[2] = readb(&nand->nfecc + 2);

116     debug('s3c24x0_nand_calculate_hwecc(%p,): 0x%02x 0x%02x 0x%02xn',

117           mtd , ecc_code[0], ecc_code[1], ecc_code[2]);

118 

119     return 0;

120 }

121 

122 static int s3c24x0_nand_correct_data(struct mtd_info *mtd, u_char *dat,

123                      u_char *read_ecc, u_char *calc_ecc)

124 {

125     if (read_ecc[0] == calc_ecc[0] &&

126         read_ecc[1] == calc_ecc[1] &&

127         read_ecc[2] == calc_ecc[2])

128         return 0;

129 

130     printf('s3c24x0_nand_correct_data: not implementedn');

131     return -1;

132 }

133 #endif

134 

135 int board_nand_init(struct nand_chip *nand)

136 {

137     u_int32_t cfg = 0;

138     u_int8_t tacls, twrph0, twrph1;

139     struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

140     struct s3c24x0_nand *nand_reg = s3c24x0_get_base_nand();

141 

142     writel(readl(&clk_power->clkcon) | (1 << 4), &clk_power->clkcon);

143 

144     /* 时序设置 */

145     tacls = 4;

146     twrph0 = 8;

147     twrph1 = 8;

148     

149     /* 初始化时序 */

150     cfg |= S3C2440_NFCONF_TACLS(tacls - 1);

151     cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);

152     cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);

153     writel(cfg, &nand_reg->nfconf);

154 

155     /* 使能NANDFLASH控制器,初始化ECC,禁止片选 */

156     writel(S3C2440_NFCONT_MODE | S3C2440_NFCONT_nCE | S3C2440_NFCONT_ECC, &nand_reg->nfcont);

157     

158     /* initialize nand_chip data structure */

159     nand->IO_ADDR_R = (void *)&nand_reg->nfdata;

160     nand->IO_ADDR_W = (void *)&nand_reg->nfdata;

161 

162     nand->select_chip = s3c2440_nand_select;

163 

164     /* hwcontrol always must be implemented */

165     nand->cmd_ctrl = s3c24x0_hwcontrol;

166 

167     nand->dev_ready = s3c24x0_dev_ready;

168 

169 #ifdef CONFIG_S3C2410_NAND_HWECC

170     nand->ecc.hwctl = s3c24x0_nand_enable_hwecc;

171     nand->ecc.calculate = s3c24x0_nand_calculate_ecc;

172     nand->ecc.correct = s3c24x0_nand_correct_data;

173     nand->ecc.mode = NAND_ECC_HW;

174     nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;

175     nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;

176     nand->ecc.strength = 1;

177 #else

178     nand->ecc.mode = NAND_ECC_SOFT;

179 #endif

180 

181 #ifdef CONFIG_S3C2440_NAND_BBT

182     nand->bbt_options |= NAND_BBT_USE_FLASH;

183 #endif

184 

185     return 0;

186 }


修改过程如下:


 1 u-boot-2016.05commonboard_r:board_init_r函数中的初始化序列init_sequence_r中的:

 2 initr_nand

 3     nand_init

 4         nand_init_chip

 5             board_nand_init

 6                 设置nand_chip结构体, 提供底层的操作函数

 7             nand_scan

 8                 nand_scan_ident

 9                     nand_set_defaults

10                         chip->select_chip = nand_select_chip;

11                         chip->cmdfunc = nand_command;

12                         chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

[1] [2]
关键字:boot  移植 引用地址:boot移植(十一)---代码修改---支持nandflash

上一篇:第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)
下一篇:按照官方手册进行mini2440 linux移植及遇到的问题

推荐阅读最新更新时间:2026-03-20 13:46

u-boot-2011.06在基于s3c2440开发板的移植支持NandFlash读写
由于s3c2410与s3c2440的NandFlash控制器不一样,因此s3c2440_nand.c文件并不能直接应用,需要进行适当的修改,而主要修改的内容就是s3c2440的相关寄存器。 首先重新定义要用到的寄存器,把原文中第27行至第37行之间的宏定义去掉,改为下面的形式: #define S3C2440_NFCONT_SECCL (1 6) #define S3C2440_NFCONT_MECCL (1 5) #define S3C2440_NFCONT_INITECC (1 4) #define S3C2440_NFCONT_nCE (1 1) #define S3C2440_NFCONT_MODE
[单片机]
-boot移植(十一)---代码修改---支持nandflash
一、移植前的修改 1.1 include/configs/jz2440修改   原来的定义:      可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash。   这个在我们文件中的82行有定义,所以不需要定义了。      将里面的S3C2410全部改为S3C2440:    1.2 drivers/mtd/nand/修改   拷贝s3c2410_nand.c 成 s3c2440_nand.c      在此目录的makefile中添加 s3c2440_nand.c      修改s3c2440_nand.c 文件,从board_nand_init 逐行检测修改,代码如下: 1 #include
[单片机]
-<font color='red'>boot</font><font color='red'>移植</font>(十一)---代码修改---<font color='red'>支持</font><font color='red'>nandflash</font>
s3c2440 K9F2G08 nandflash支持硬件ECC校验
S3c2440的nandflash K9F2G08是支持硬件ECC的,NandFlash的每一页分为main区和spare区,S3C2440的NandFlash控制器支持这两个区的硬件ECC,这里我们实现main区的硬件ECC。在include/configs/fl2440.h文件中,如果我们定义了nandflash的硬件ECC校验,那么我们就可以控制相应的nandflash寄存器,实现硬件ECC。 nandflash的每一页有两区:main区和spare区,main区用于存储正常的数据,spare区用于存储其他附加信息,其中就包括ECC校验码。 当我们在写入数据的时候,我们就计算这一页数据的ECC校验码,然后把校验码
[单片机]
【IMX6ULL学习笔记】五、U-BOOT移植与解析
一、移植自定义开发板流程 1、添加 mx6ull_kodo_emmc_defconfig 配置文件(.config) 在 /config s目录下,复制 mx6ull_14x14_evk_emmc_defconfig 文件,重命名为 mx6ull_kodo_emmc_defconfig 并修改其中内容,如下: CONFIG_SYS_EXTRA_OPTIONS= IMX_CONFIG=board/freescale/mx6ull_kodoboard/imximage.cfg,MX6ULL_EVK_EMMC_REWORK CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MX6ULL_K
[单片机]
【IMX6ULL学习笔记】五、U-<font color='red'>BOOT</font><font color='red'>移植</font>与解析
u-boot1.3.4向S5PV210移植
一、串口无输出   按源码编译后,串口无输出。开发板供电锁存成功。   进入start.S中查看,发现多了PMIC_InitIp,即电源管理模块初始化。屏蔽后发现串口可以输出。 二、DDR配置信息修改   从启动打印信息,以及bdinfo命令中可以看到SDRAM的设置错误。   使用md和mw命令测试内存,发现20000000和40000000开头的内存都是可以用的,说明代码中DDR初始化部分是正确的,只是size错了。   改用如下配置 #define MEMORY_BASE_ADDRESS 0x30000000 #define CONFIG_NR_DRAM_BANKS 2 /* we have 2 ban
[单片机]
u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
网卡芯片的工作原理 DM9000AE具有以下主要性能: ①48管脚的LQFP封装,管脚少体积小; ②支持8/16位数据总线; ③适用于10Base-T和100Base-T,10/100M自适应,适应不同的网络速度要求 ④内置16KB的SRAM,用于收发缓冲,降低对主处理器的速度要求; ⑤支持IP /TCP /UDP加速,减轻了CPU负担,提高网络速度;⑥支持Back pressure半双工流量控制,与IEEE802.3u兼容,支持IEEE802.3x全双工流量控制; ⑦20ns响应时间,2.5V/3.3V低功耗。下图是DM9000网卡芯片常用在嵌入式网络系统上的结构框图。 数据支持8位和16位,不同模式下的PIN脚定义是不
[单片机]
u-<font color='red'>boot</font> <font color='red'>移植</font> --->5、友善之臂Tiny210底板王网卡驱动<font color='red'>移植</font>
u-boot 移植 --->3、S5PV210启动序列
S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,了解到S5PVS10这款芯片的复位过程启动序列。芯片在出厂时就在内部固化了一段程序internal ROM简称iROM,这段代码在芯片复位一后会自动运行,他主要负责初始化系统的时钟等具体如下: 1. Disable the Watch-Dog Timer \关闭看门狗 2. Initialize the instruction cache \关闭指定cache 3. Initialize the stack region (see “memory map” on chap 2.5) \设置不同模式的栈指针 4. Init
[单片机]
u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
---------------------------------------------------------- 使用环境 PC: Centos5.4 kernel: 3.0.1 corss: arm-linux-gcc 4.4.1 arm: s3c6410 uboot: uboot-2010-03 ---------------------------------------------------------- uboot的第一阶段,其实做的事情也是比较多的,,但是一般来说,重点就是配置各种硬件环境,来保证第二阶段能正常启动. 而该部分根据不同的硬件也是不同的..像我的,s3c6410有2片dr
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved