JZ2440学习笔记
Chili
2015.5
第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。
图 1
5.1 legacy检测nor flash方式
Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdJedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
图 2
看JZ2440v2电路图,我们发现采用的nor flash器件为MX29LV800BBTC(实际采用的nor flash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4JZ2440学习笔记
Chili
2015.5
第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。
图 1
5.1 legacy检测nor flash方式
Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdJedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
图 2
看JZ2440v2电路图,我们发现采用的nor flash器件为MX29LV800BBTC(实际采用的nor flash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_flash.c
在jedec_table中添加以下结构,这是拷贝jedec_table后面的MX29LV800BBTC结构信息并进行修改的(注意不要在条件编译里面定义,否则可能还是未定义,建议放在table的第一个元素出,便于查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},
图 3
保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
图 4
由打印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor flash今后支持的方向,标准的检测方式:CFI方式。
5.2 CFI接口检测方式
CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h
修改如下:
图 5
修改函数返回值,使uboot采用CFI方式进行nor flash检测:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c
如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
图 6
保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写进nor flash,启动,打印如下:
图 7
flash大小,扇区都正确,ok,nor flash驱动移植成功。
在jedec_table中添加以下结构,这是拷贝jedec_table后面的MX29LV800BBTC结构信息并进行修改的(注意不要在条件编译里面定义,否则可能还是未定义,建议放在table的第一个元素出,便于查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},
图 3
保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
图 4
由打印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor flash今后支持的方向,标准的检测方式:CFI方式。
5.2 CFI接口检测方式
CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
book@book-desktop:~/uboot/u-boot-2015.04-rc4JZ2440学习笔记
Chili
2015.5
第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。
图 1
5.1 legacy检测nor flash方式
Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdJedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
图 2
看JZ2440v2电路图,我们发现采用的nor flash器件为MX29LV800BBTC(实际采用的nor flash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_flash.c
在jedec_table中添加以下结构,这是拷贝jedec_table后面的MX29LV800BBTC结构信息并进行修改的(注意不要在条件编译里面定义,否则可能还是未定义,建议放在table的第一个元素出,便于查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},
图 3
保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
图 4
由打印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor flash今后支持的方向,标准的检测方式:CFI方式。
5.2 CFI接口检测方式
CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h
修改如下:
图 5
修改函数返回值,使uboot采用CFI方式进行nor flash检测:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c
如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
图 6
保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写进nor flash,启动,打印如下:
图 7
flash大小,扇区都正确,ok,nor flash驱动移植成功。
修改如下:
图 5
修改函数返回值,使uboot采用CFI方式进行nor flash检测:
book@book-desktop:~/uboot/u-boot-2015.04-rc4JZ2440学习笔记
Chili
2015.5
第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。
图 1
5.1 legacy检测nor flash方式
Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdJedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
图 2
看JZ2440v2电路图,我们发现采用的nor flash器件为MX29LV800BBTC(实际采用的nor flash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_flash.c
在jedec_table中添加以下结构,这是拷贝jedec_table后面的MX29LV800BBTC结构信息并进行修改的(注意不要在条件编译里面定义,否则可能还是未定义,建议放在table的第一个元素出,便于查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},
图 3
保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
图 4
由打印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor flash今后支持的方向,标准的检测方式:CFI方式。
5.2 CFI接口检测方式
CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h
修改如下:
图 5
修改函数返回值,使uboot采用CFI方式进行nor flash检测:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c
如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
图 6
保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写进nor flash,启动,打印如下:
图 7
flash大小,扇区都正确,ok,nor flash驱动移植成功。
如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
图 6
保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4JZ2440学习笔记
Chili
2015.5
第二部分,移植uboot2015支持JZ2440的nor flash
5,修改uboot支持nor flash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。
图 1
5.1 legacy检测nor flash方式
Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdJedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
图 2
看JZ2440v2电路图,我们发现采用的nor flash器件为MX29LV800BBTC(实际采用的nor flash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_flash.c
在jedec_table中添加以下结构,这是拷贝jedec_table后面的MX29LV800BBTC结构信息并进行修改的(注意不要在条件编译里面定义,否则可能还是未定义,建议放在table的第一个元素出,便于查看)
{
.mfr_id = (u16)MX_MANUFACT,
.dev_id = AM29LV160DB,
.name = "AM29LV160DB",
.uaddr = {
[0] = MTD_UADDR_0x0555_0x02AA
},
.DevSize = SIZE_2MiB,
.CmdSet = CFI_CMDSET_AMD_LEGACY,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x10000, 15),
ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}
},
图 3
保存更改,再次make
book@book-desktop:~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
图 4
由打印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor flash今后支持的方向,标准的检测方式:CFI方式。
5.2 CFI接口检测方式
CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h
修改如下:
图 5
修改函数返回值,使uboot采用CFI方式进行nor flash检测:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c
如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
图 6
保存,make again!!
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写进nor flash,启动,打印如下:
图 7
flash大小,扇区都正确,ok,nor flash驱动移植成功。
编译成功,烧写进nor flash,启动,打印如下:
图 7
flash大小,扇区都正确,ok,nor flash驱动移植成功。
学习交流平台QQ群:864588072
|