JZ2440学习笔记Word文档下载推荐.docx
- 文档编号:19034135
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:51
- 大小:2.69MB
JZ2440学习笔记Word文档下载推荐.docx
《JZ2440学习笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JZ2440学习笔记Word文档下载推荐.docx(51页珍藏版)》请在冰豆网上搜索。
badvalue(armv4)for-march=switch
badvalue(armv4)for-mtune=switch
make[2]:
***[include/autoconf.mk]Error1
make[1]:
***[silentoldconfig]Error1
make:
***Noruletomaketarget`include/config/auto.conf'
neededby`include/config/uboot.release'
.Stop.
错误并不可怕,学会看错误提示,根据提示进行下一步工作。
错误提示意思好像是说机器平台不对,那么我们就来指定,打开顶层Makefile,指定交叉编译器和架构平台:
~/uboot/u-boot-2015.04-rc4$vimMakefile
如图所示添加下面两行:
ARCH=arm
CROSS_COMPILE=arm-linux-
完成后,再次执行:
make开始编译
ASarch/arm/lib/vectors.o
ASarch/arm/lib/crt0.o
ASarch/arm/lib/relocate.o
arch/arm/lib/relocate.S:
Assemblermessages:
50:
Error:
selectedprocessordoesnotsupport`bxlr'
***[arch/arm/lib/relocate.o]Error1
***[arch/arm/lib]Error2
耐着性子认真看错误信息,说不支持bxlr指令,这是arm的一个跳转指令,没理由arm交叉编译器不支持啊,是不是版本太低了?
查看版本:
arm-linux-gcc-v
版本为3.4.5,貌似JZ2440光盘上的ubuntu上自带的交叉编译环境是比较老了,那我们网上搜索个新的,装上试试看。
在4.4.3下载,并有详尽的安装方法,读者可自行下载并安装。
安装完成后查看版本如下,说明安装成功。
2,编译
在arm-linux-gcc4.4.3的基础上进行uboot编译:
接下来就是一路编译成功,并生产uboot.bin等映像文件。
3,烧写默认配置的uboot
由于JZ2440配有Jlink,Jlink一般来说不支持烧写nandfalsh,当然可以购买百问网的Gflash,其可以通过Jlink烧写nandflash。
我们一般是购买JZ2440标准配置开发板,那咱就用norflash启动,并通过Jlink的J-Flash将uboot.bin烧写进norflash,重启,观察串口输出。
Ps:
安装学前班\J-link\USB-ICE,安装完后打开J-Flash,打开开发板资料\如何烧写S3C2440裸板程序\s3c2440.jflash工程,打开刚编译成功的文件uboot.bin,按下F5开始编程。
重启开发板,串口无任何现象,说明默认的smdk2410.h的配置还是不适用与我们现在JZ2440的板子。
好了接下来开始一点点修改uboot了。
4,修改uboot支持JZ2440串口
4.1修改uboot时钟配置
串口没有输出的话,首先想到的肯定是时钟没有配置好,好的,有想法立即就去试试。
相信看过韦老师的《嵌入式Linux应用开发完全手册》,应该知道S3C2440和S3C2410时钟计算法不一样,因此我们打开smdk2410.c,修改初始化函数中的时钟配置。
命令如下:
~/uboot/u-boot-2015.04-rc4$vimboard/samsung/smdk2410/smdk2410.c
修改如下:
1,将时钟宏更改如图
#defineM_MDIV0x5c
#defineM_PDIV0x1
#defineM_SDIV0x1
2,修改intboard_early_init_f(void)函数添加CLKDIVN寄存器配置
如下:
writel(0x5,&
clk_power->
clkdivn);
保存,并编译,烧写,重启开发板查看现象:
分析:
有打印乱码数据,说明板子至少在工作,只是波特率设置不正确,下面看串口波特率在哪里设置,并进行修改就可以了。
4.2修改串口驱动
我们在sourceInsight中根据韦老师开发手册书籍上的说明,按uboot执行的流程一步步查找uboot串口初始化函数,最后发现在u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\serial\serial-s3c24x0.c中
serial_init_dev(constintdev_index)函数完成串口初始化,调用stati_serial_setbrg(constintdev_index)设置波特率,设置波特率时的获取时钟函数如下:
ulongget_HCLK(void)
{
structs3c24x0_clock_power*clk_power=s3c24x0_get_base_clock_power();
#ifdefCONFIG_S3C2440
switch(readl(&
clkdivn)&
0x6){
default:
case0:
returnget_FCLK();
case2:
returnget_FCLK()/2;
case4:
return(readl(&
camdivn)&
(1<
<
9))?
get_FCLK()/8:
get_FCLK()/4;
case6:
8))?
get_FCLK()/6:
get_FCLK()/3;
}
#else
return(readl(&
2)?
get_FCLK()/2:
get_FCLK();
#endif
}
说明现在的uboot已经支持获取s3c2440的时钟来自行计算波特率了,但需要我们在配置文件smdk2410.h中定义s3c2440的宏。
因此我们就去配置:
~/uboot/u-boot-2015.04-rc4$viminclude/configs/smdk2410.h
保存,现在串口应该就可以用了,我们make下
编译成功并生产uboo.bin,烧写进norflash,重启开发板,打印如下,说明串口可用了。
5,修改uboot支持norflash
继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现norflash的初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c中的函数voidboard_init_r(gd_t*id,ulongdest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行norflash检测,否则用标准CFI接口进行检测,我们分别说明。
5.1legacy检测norflash方式
Legacy检测方式是通过AMD和Intel的标准指令进行norflash的ID读取,随后将读取的ID跟u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\Jedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。
看JZ2440v2电路图,我们发现采用的norflash器件为MX29LV800BBTC(实际采用的norflash器件应该不是这个,可能是第一版本的,没有更新过来,发现原因下面来讲)
因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测norflashID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的norflash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。
因此修改如下:
~/uboot/u-boot-2015.04-rc4$vimdrivers/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),
}
},
保存更改,再次make
~/uboot/u-boot-2015.04-rc4$make
编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
由打印信息可知,现在norflash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取norflash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。
这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测norflash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说norflash今后支持的方向,标准的检测方式:
CFI方式。
5.2CFI接口检测方式
CFI大家可自行XX了解,简单说就是norflash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。
首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数
修改函数返回值,使uboot采用CFI方式进行norflash检测:
如图所示,将返回值改为0即采用CFI方式,return1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。
保存,makeagain!
!
编译成功,烧写进norflash,启动,打印如下:
flash大小,扇区都正确,ok,norflash驱动移植成功。
6,修改uboot支持nandflash
与norflash的初始化类似,nandflash初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c中的函数voidboard_init_r(gd_t*id,ulongdest_addr)中的nand_init()中进行,用sourceInsight一路跟踪代码,发现最后调用了S3c2410_nand.c(u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\nand)对nand进行初始化,那么本次我们就需要修改此文件。
6.1修改S3c2410_nand.c寄存器偏移宏定义
~/uboot/u-boot-2015.04-rc4$vimdrivers/mtd/nand/s3c2410_nand.c
因为,S3C2440和2410的nand控制器有些区别,时序设置需要多设置一个寄存器,而且寄存器偏移不一致,因此添加如下图所示的宏定义,添加:
#defineS3C2440_ADDR_NALE12
#defineS3C2440_ADDR_NCLE8
#defineS3C2440_NFCONT_nFCE(1<
1)
6.2修改board_nand_init函数设置时序
由于2440的nand控制寄存器与2410有区别,所以要做修改:
tacls=0;
twrph0=4;
twrph1=2;
...
writel(((tacls<
12)|(twrph0<
8)|(twrph1<
4)),&
nand_reg->
nfconf);
writel((1<
0)|(0<
1)|(1<
4),&
nfcont);
6.3修改s3c24x0_hwcontrol函数
Uboot的nand驱动最重要的就是这个函数了,它实现了nand读写的最底层控制,此处修改不当直接导致nand驱动不起来,因此需要特别注意。
#ifdefined(CONFIG_S3C2410)
if(ctrl&
NAND_NCE)
writel(readl(&
nand->
nfconf)&
~S3C2410_NFCONF_nFCE,
&
else
nfconf)|S3C2410_NFCONF_nFCE,
#elifdefined(CONFIG_S3C2440)
NAND_NCE)/*modifiedbychili,2440*/
nfcont)&
~S3C2440_NFCONT_nFCE,
nfcont)|S3C2440_NFCONT_nFCE,
6.4编译烧写
编译成功,烧写启动,打印如下,说明nand驱动成功。
至此就可以使用nand命令进行操作flash了
6.5解决nandwrite失败
经过上面一番更改,我们已经可以使用uboot自带的一些nand操作指令了,下面我们就来测试下效果如何,nand命令网上非常多资料,这种东西就可自行XX了解,其实XX上的都是别人看uboot后发上去的,那我们都可以自己看uboot帮助信息的,直接:
SMDK2410#nand
帮助信息,说的很清楚哦,也别啥事都想到XX,自己可以想想想,解决看看。
先试试擦除,再nanddump看下flash内数据:
SMDK2410#nanderase100000100000
SMDK2410#nanddump100000
显示如下说明erase成功:
我们准备将内存30000000数据烧写进nand中,事先先看看内存中的数据是什么,等下好对比:
SMDK2410#md30000000
万事具备,开始烧写nand:
SMDK2410#nandwrite300000100000100000
咦?
明明显示写入成功,为何数据还是FF,这说明数据压根都没写进去啊,多写几次还是如此,怎么回事啊?
难道uboot有问题?
放心这一般不可能,一定是你自己底层驱动写的有问题。
先让我们理一理我们干了什么,忘了的童孩可以把6.1-6.3节重新复习遍:
6.1设置S3C2440寄存器偏移和片选宏。
可以读,但是写不进去,这里应该没问题,否则绝对无法读取数据的。
6.2设置nand操作时序。
还是那个原理,读数据都可以,说明读时序没问题,那么是不是写时序有问题?
有可能,去检查设置时序和韦老师给的uboot1.6中nand操作时序,发现一致,说明时序肯定也没问题。
6.3修改s3c24x0_hwcontrol底层命令控制函数
刚说这个函数很重要,是上层操作nand函数的最底层函数,ok,我们仔细看看,是不是哪里疏忽了:
在最后,添加IO_W的默认寄存器指向。
保存编译烧写,启动,测试:
SMDK2410#nandwrite30000000100000100000
擦除后数据:
写入后数据:
Ok,写入成功!
至此,nandflash驱动工作完全正常!
7,修改uboot支持DM9000
Uboot内核已经支持DM9000网口,先打开DM9000的驱动看看,因为我们看电路图知道DM9000通过内存接口连到了JZ2440上,在Dm9000x.c(u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\net)中也有对内存进行操作,从而控制DM9000,但是DM9000.c中并没有任何关于DM9000_IO以及DM9000_DATA的定义。
由于内存接口的定义跟硬件息息相关,所以驱动并没有定义,用户实际用到该驱动时,需要自己根据实际连接情况自己定义。
这种属于配置定义,所以我们就去smdk2410.h添加:
在板级初始化函数中添加dm9000的初始化函数:
保存,编译烧写,启动,打印如下
根据打印提示,我们知道Dm9000a驱动成功,但是MAC地址未进行设置,下面去smdk2410.h中继续添加配置
修改配置文件
~/uboot/u-boot-2015.04-rc4$viminclude/configs/smdk2410.h
添加
#defineCONFI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JZ2440 学习 笔记