版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一部分,移植uboot2015支持JZ2440串口前言本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114,LPC1343,STM32,blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。靠着这点小经验,以及新学习的知识,自己动手移植了最新的uboot,绝对原创,得益于韦老师的书籍以及开发板,能让我们这个小白可以踏进linux的世界,但本人毕竟在linux方面只是个类似小白的学生,许多不对之处,希望大家不吝指教!说明:阅读本文需要一点的ARM以及S3C2440的基础知识,建议先阅读嵌入式Linux应用开
2、发完全手册,此书对对ARM以及JZ2440有很好的介绍和说明,在阅读中有不懂的也可以再去翻看此书,查漏补缺。JZ2440移植最新u-boot-2015.04-rc4.tar1,配置uboot 去官网下载最新uboot源代码u-boot-2015.04-rc4.tar,开发环境采用JZ2440光盘上的vmware虚拟机ubuntu9.10。本次采用smdk2410的默认配置来配置uboot,然后启动类似linux一样的menuconfig菜单进行配置,然后make,并烧写进JZ2440看效果,然后根据现象一步步修改。我们移植uboot的基本原则是:因为我们刚上手,可能什么都不知道,更加不知需要更
3、改什么,这个时候我们就先尽量什么都不改,直接烧写进去看现象,然后根据现象或者提示信息一步步更改,从而移植完成。配置命令如下:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ tar jxvf u-boot-2015.04-rc4.tar.bz2bookbook-desktop:/uboot/u-boot-2015.04-rc4$ cd u-boot-2015.04-rc4/bookbook-desktop:/uboot/u-boot-2015.04-rc4$ m
4、ake smdk2410_defconfigbookbook-desktop:/uboot/u-boot-2015.04-rc4$ make menuconfig3,在uboot根目录执行bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make报错:cc1: error: bad value (armv4) for -march= switchcc1: error: bad value (armv4)
5、60;for -mtune= switchmake2: * include/autoconf.mk Error 1make1: * silentoldconfig Error 1make: * No rule to make target include/config/auto.conf', needed by include/config/uboot.release'.
6、; Stop.错误并不可怕,学会看错误提示,根据提示进行下一步工作。错误提示意思好像是说机器平台不对,那么我们就来指定,打开顶层Makefile,指定交叉编译器和架构平台:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ vim Makefile 如图所示添加下面两行:ARCH=armCROSS_COMPILE=arm-linux-图 1 完成后,再次执行:make 开始编译bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make报错:&
7、#160; AS arch/arm/lib/vectors.o AS arch/arm/lib/crt0.o AS arch/arm/lib/relocate.oarch/arm/lib/relocate.S: Assembler messages:arch/arm/lib/relocate.S:50:
8、Error: selected processor does not support bx lr'make1: * arch/arm/lib/relocate.o Error 1make: * arch/arm/lib Error 2耐着性子认真看错误信息,说不支持bx lr指令,这是arm的一个跳转指令,没理由arm交叉编译器不支持啊,是不是版本太低了?查看版本:arm-linux-gcc -v图 2
9、60;版本为3.4.5,貌似JZ2440光盘上的ubuntu上自带的交叉编译环境是比较老了,那我们网上搜索个新的,装上试试看。在图 32,编译在arm-linux-gcc 4.4.3的基础上进行uboot编译:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make接下来就是一路编译成功,并生产uboot.bin等映像文件。图 43,烧写默认配置的uboot由于JZ2440配有Jlink,Jlink一般来说不支持烧写nand falsh,当然可以购买百问网的Gflash,其可以通过Jlink烧写nand&
10、#160;flash。我们一般是购买JZ2440标准配置开发板,那咱就用nor flash启动,并通过Jlink的J-Flash将uboot.bin烧写进nor flash,重启,观察串口输出。 Ps:安装 学前班J-linkUSB-ICE,安装完后打开J-Flash, 打开 开发板资料如何烧写S3C2440裸板程序s3c2440.jflash工程,打开刚编译成功的文件uboot.bin,按下F5开始编程。重启开发板,串口无任何现象,说明默认的smdk2410.h的配置还是不适用与我们现在JZ2440的板子。好了接下来开始一点点修改u
11、boot了。4,修改uboot支持JZ2440串口4.1 修改uboot时钟配置串口没有输出的话,首先想到的肯定是时钟没有配置好,好的,有想法立即就去试试。相信看过韦老师的嵌入式Linux应用开发完全手册,应该知道S3C2440和S3C2410时钟计算法不一样,因此我们打开smdk2410.c,修改初始化函数中的时钟配置。命令如下:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c 修改如下:1,将时钟宏更改如图#define M_M
12、DIV 0x5c#define M_PDIV 0x1#define M_SDIV 0x1图 5 2,修改int board_early_init_f(void)函数添加CLKDIVN寄存器配置如下:writel(0x5, &clk_power->clkdivn);图6 保存,并编译,烧写,重启开发板查看现象:图 7 分析:有打印乱码数据,说明板子至少在工作,只是波特率设置不正确,下面看串口波特率在哪里设置,并进行修改就可
13、以了。4.2 修改串口驱动我们在sourceInsight中根据韦老师开发手册书籍上的说明,按uboot执行的流程一步步查找uboot串口初始化函数,最后发现在u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversserialserial-s3c24x0.c中serial_init_dev(const int dev_index)函数完成串口初始化,调用stati_serial_setbrg(const int dev_index)设置波特率,设置波特率时的获取时钟函数如下:ulong g
14、et_HCLK(void)struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();#ifdef CONFIG_S3C2440switch (readl(&clk_power->clkdivn) & 0x6) default:case 0:return get_FCLK();case 2:return get_FCLK() / 2;case&
15、#160;4:return (readl(&clk_power->camdivn) & (1 << 9) ?get_FCLK() / 8 : get_FCLK() / 4;case 6:return (readl(&clk_power->camdivn) & (1 << 8) ?get_FCLK() / 6 :
16、 get_FCLK() / 3;#elsereturn (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();#endif说明现在的uboot已经支持获取s3c2440的时钟来自行计算波特率了,但需要我们在配置文件smdk2410.h中定义s3c2440的宏。因此我们就去配置:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ vim
17、160;include/configs/smdk2410.h 修改如下:图 8 保存,现在串口应该就可以用了,我们make下bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make编译成功并生产uboo.bin,烧写进nor flash,重启开发板,打印如下,说明串口可用了。图 9第二部分,移植uboot2015支持JZ2440的nor flash5,修改uboot支持nor flash继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash
18、的初始化在文件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检测n
19、or 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器件应该不是这个,可能是第一版本的,没有更
20、新过来,发现原因下面来讲)因为我们在jedec_table中发现其实有定义该器件的信息,但是为何uboot读不到呢,当我把uboot的Debug打开,打印出调试信息时,发现uboot检测nor flash ID为0x2249,对应于Jedec_flash.c宏定义的AM29LV160DB,那么实际开发板上的nor flash型号应该是这个,害我纠结半天,查看jedec_table中并没有器件定义。因此修改如下:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/jedec_fl
21、ash.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
22、 = CFI_CMDSET_AMD_LEGACY,.NumEraseRegions= 4,.regions = ERASEINFO(0x10000, 15),ERASEINFO(0x08000, 1),ERASEINFO(0x02000, 2),ERASEINFO(0x04000, 1),图 3 保存更改,再次makebookbook-desktop:/uboot/u-boot-2015.04-rc4$make编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:图 4 由打
23、印信息可知,现在nor flash可以识别了,但是flash大小和扇区数量不对啊,注意采用legacy获取nor flash信息参数的来源,这些参数都是根据我们添加进jedec_table表的器件信息算出来的,但由于我这个器件信息是在原来1M的MX29LV800BBTC基础上修改了一个器件ID得来的,因此uboot实际计算出来的信息就跟MX29LV800BBTC一模一样了。这种老的方式需要自己实现定义器件信息,因此不是很灵活,本次也只是让读者知道这个原理,legacy检测nor flash方式也就介绍到这里,下面介绍一种更加灵活的,也是uboot或者说nor
24、60;flash今后支持的方向,标准的检测方式:CFI方式。5.2 CFI接口检测方式CFI大家可自行百度了解,简单说就是nor flash的一种通用接口规范,大家都按照这种规范来生产flash器件,这样就可以实现一种软件可以适用于各个不同厂家的flash,进而实现了软件的复用性,设计上更改flash器件而不需要更改驱动程序,极大的方便了flash驱动的维护工作。首先根据AM29LV160DB手册(要学会看手册哦,那些都是些比较简单的英语,多看几遍把主要的单词记下,以后翻来覆去就是那么几个专业词汇)更改支持的最大扇区数bookbook-desktop:/uboot/u-bo
25、ot-2015.04-rc4$ vim include/configs/smdk2410.h 修改如下:图 5 修改函数返回值,使uboot采用CFI方式进行nor flash检测:bookbook-desktop:/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c 如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。图 6保存,make
26、160;again!bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make编译成功,烧写进nor flash,启动,打印如下:图 7flash大小,扇区都正确,ok,nor flash驱动移植成功。第三部分,移植uboot2015支持JZ2440的nand flash6,修改uboot支持nand flash 与nor flash的初始化类似,nand flash初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440ar
27、charmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的nand_init()中进行,用sourceInsight一路跟踪代码,发现最后调用了S3c2410_nand.c (u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdnand)对nand进行初始化,那么本次我们就需要修改此文件。6.1 修改S3c2410_nand.c 寄存器偏移宏定义bookbook-desktop:/uboo
28、t/u-boot-2015.04-rc4$ vim drivers/mtd/nand/s3c2410_nand.c 因为,S3C2440和2410的nand控制器有些区别,时序设置需要多设置一个寄存器,而且寄存器偏移不一致,因此添加如下图所示的宏定义,添加:#define S3C2440_ADDR_NALE 12#define S3C2440_ADDR_NCLE 8#define S3C2440_NFCONT_nFCE (
29、1<<1)图 16.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), &
30、nand_reg->nfcont);图 26.3修改s3c24x0_hwcontrol函数Uboot的nand驱动最重要的就是这个函数了,它实现了nand读写的最底层控制,此处修改不当直接导致nand驱动不起来,因此需要特别注意。修改如下:#if defined(CONFIG_S3C2410) if (ctrl & NAND_NCE
31、) writel(readl(&nand->nfconf) & S3C2410_NFCONF_nFCE,
32、 &nand->nfconf); else
33、0; writel(readl(&nand->nfconf) | S3C2410_NFCONF_nFCE,
34、60; &nand->nfconf); #elif defined(CONFIG_S3C2440) if (ctrl & NAND_NCE)/* modified by chil
35、i, 2440*/ writel(readl(&nand->nfcont) & S3C2440_NFCONT_nFCE,
36、; &nand->nfcont); else
37、60; writel(readl(&nand->nfcont) | S3C2440_NFCONT_nFCE,
38、160; &nand->nfcont);#endif图 36.4编译烧写bookbook-desktop:/uboot/u-boot-2015.04-rc4$ make编译成功,烧写启动,打印如下,说明nand驱动成功。至此就可以使用nand命令进行操作flash了图 46.5 解决nand write失败经过上面一番更改,我们已经可以使用uboot自带的
39、一些nand操作指令了,下面我们就来测试下效果如何,nand命令网上非常多资料,这种东西就可自行百度了解,其实百度上的都是别人看uboot后发上去的,那我们都可以自己看uboot帮助信息的,直接:SMDK2410 # nand图 5帮助信息,说的很清楚哦,也别啥事都想到百度,自己可以想想想,解决看看。先试试擦除,再nand dump 看下flash内数据:SMDK2410 # nand erase 100000 100000SMDK2410 # nand dump&
40、#160;100000显示如下说明erase成功:图 6我们准备将内存30000000数据烧写进nand中,事先先看看内存中的数据是什么,等下好对比:SMDK2410 # md 30000000图 7万事具备,开始烧写nand:SMDK2410 # nand write 300000 100000 100000SMDK2410 # nand dump 100000图 8咦?明明显示写入成功,为何数据还是FF,这说明数据压根都没写进去啊,
41、多写几次还是如此,怎么回事啊?难道uboot有问题?放心这一般不可能,一定是你自己底层驱动写的有问题。先让我们理一理我们干了什么,忘了的童孩可以把6.1-6.3节重新复习遍:6.1 设置S3C2440寄存器偏移和片选宏。分析:可以读,但是写不进去,这里应该没问题,否则绝对无法读取数据的。6.2 设置nand操作时序。分析:还是那个原理,读数据都可以,说明读时序没问题,那么是不是写时序有问题?有可能,去检查设置时序和韦老师给的uboot1.6中nand 操作时序,发现一致,说明时序肯定也没问题。6.3 修改s3c24x0_hwcontrol底层命令控制函数
42、刚说这个函数很重要,是上层操作nand函数的最底层函数,ok,我们仔细看看,是不是哪里疏忽了:图 9在最后,添加IO_W的默认寄存器指向。图 10保存编译烧写,启动,测试:SMDK2410 # nand erase 100000 100000SMDK2410 # nand dump 100000SMDK2410 # nand write 30000000 100000 100000SMDK2410 # nand dump 100000擦除后数据:图 11Ok,写入成功!至此,nand flash驱动工作完全正常!第四部分,移植uboot2015支持JZ2440的DM90007,修改uboot支持DM9000Uboot 内核已经支持DM9000网口,先打开DM9000的驱动看看,因为我们看电路图知道DM9000通过内存接口连到了JZ2440上,在Dm9000x.c (u-boot-2015.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新员工培训奖惩管理办法
- 综合专项应急演练培训
- 预防普通感冒的措施
- 自制英语课件教学课件
- 神秘的宇宙培训宣传
- 第四章 曲线运动-教材实验5 探究平抛运动的特点 2025年高考物理基础专项复习
- 防台防汛安全教育培训
- 繁育员的年终总结
- 深度学习及自动驾驶应用 课件 第1、2章 汽车自动驾驶技术概述、深度学习基础
- 花样跳绳说课稿小学
- 3-6《制作钟摆》课件
- 新教材人教版高中英语必修第一册-Unit4-Natural-disasters-教学课件
- 药物代谢动力学-中国药科大学中国大学mooc课后章节答案期末考试题库2023年
- 易货详细讲解PPT
- 2022年《中央企业合规管理办法》要点解读
- 网店运营PPT全套完整教学课件
- GB/T 16895.13-2022低压电气装置第7-701部分:特殊装置或场所的要求装有浴盆或淋浴的场所
- 国家开放大学一网一平台电大《监督学》形考任务1-4网考题库及答案
- 小升初语文暑期衔接 非连续性文本阅读专练卷5人教部编版 (含答案)
- 关于每日英语短文朗读3篇 英语四级口语考试短文朗读范文
- 山西昔阳安顺乐安煤业有限公司矿山矿产资源开发利用、地质环境保护与土地复垦方案
评论
0/150
提交评论