马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
JZ2440学习笔记
Chili
2015.5
前言本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114,LPC1343,STM32,blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。靠着这点小经验,以及新学习的知识,自己动手移植了最新的uboot,绝对原创,得益于韦老师的书籍以及开发板,能让我们这个小白可以踏进linux的世界,但本人毕竟在linux方面只是个类似小白的学生,许多不对之处,希望大家不吝指教!
说明:阅读本文需要一点的ARM以及S3C2440的基础知识,建议先阅读《嵌入式Linux应用开发完全手册》,此书对对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的基本原则是:因为我们刚上手,可能什么都不知道,更加不知需要更改什么,这个时候我们就先尽量什么都不改,直接烧写进去看现象,然后根据现象或者提示信息一步步更改,从而移植完成。 配置命令如下: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ tar jxvf u-boot-2015.04-rc4.tar.bz2 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ cd u-boot-2015.04-rc4/ book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make smdk2410_defconfig book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make menuconfig 3,在uboot根目录执行 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 报错: cc1: error: bad value (armv4) for -march= switch cc1: error: bad value (armv4) for -mtune= switch make[2]: *** [include/autoconf.mk] Error 1 make[1]: *** [silentoldconfig] Error 1 make: *** No rule to make target `include/config/auto.conf', needed by `include/config/uboot.release'. Stop. 错误并不可怕,学会看错误提示,根据提示进行下一步工作。错误提示意思好像是说机器平台不对,那么我们就来指定,打开顶层Makefile,指定交叉编译器和架构平台: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim Makefile 如图所示添加下面两行: ARCH=arm CROSS_COMPILE=arm-linux- file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps146B.tmp.jpg
完成后,再次执行:make 开始编译 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 报错: AS arch/arm/lib/vectors.o AS arch/arm/lib/crt0.o AS arch/arm/lib/relocate.o arch/arm/lib/relocate.S: Assembler messages: arch/arm/lib/relocate.S:50: Error: selected processor does not support `bx lr' make[1]: *** [arch/arm/lib/relocate.o] Error 1 make: *** [arch/arm/lib] Error 2 耐着性子认真看错误信息,说不支持bx lr指令,这是arm的一个跳转指令,没理由arm交叉编译器不支持啊,是不是版本太低了? 查看版本: arm-linux-gcc -v file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps146C.tmp.jpg
版本为3.4.5,貌似JZ2440光盘上的ubuntu上自带的交叉编译环境是比较老了,那我们网上搜索个新的,装上试试看。 在http://dl.dbank.com/c01p81pb9i网站有arm-linux-gcc 4.4.3下载,并有详尽的安装方法,读者可自行下载并安装。安装完成后查看版本如下,说明安装成功。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps147C.tmp.jpg
2,编译在arm-linux-gcc 4.4.3的基础上进行uboot编译: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 接下来就是一路编译成功,并生产uboot.bin等映像文件。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps147D.tmp.jpg
3,烧写默认配置的uboot由于JZ2440配有Jlink,Jlink一般来说不支持烧写nand falsh,当然可以购买百问网的Gflash,其可以通过Jlink烧写nand flash。我们一般是购买JZ2440标准配置开发板,那咱就用nor flash启动,并通过Jlink的J-Flash将uboot.bin烧写进nor flash,重启,观察串口输出。 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,修改初始化函数中的时钟配置。命令如下: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c 修改如下: 1,将时钟宏更改如图 #define M_MDIV
0x5c #define M_PDIV
0x1 #define M_SDIV
0x1 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps148E.tmp.jpg
2,修改int board_early_init_f(void)函数添加CLKDIVN寄存器配置
如下: writel(0x5, &clk_power->clkdivn); file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps148F.tmp.jpg
保存,并编译,烧写,重启开发板查看现象: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14A0.tmp.jpg
分析:有打印乱码数据,说明板子至少在工作,只是波特率设置不正确,下面看串口波特率在哪里设置,并进行修改就可以了。
4.2 修改串口驱动我们在sourceInsight中根据韦老师开发手册书籍上的说明,按uboot执行的流程一步步查找uboot串口初始化函数,最后发现在u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\serial\serial-s3c24x0.c中 serial_init_dev(const int dev_index)函数完成串口初始化,调用stati_serial_setbrg(const int dev_index)设置波特率,设置波特率时的获取时钟函数如下: ulong get_HCLK(void) {
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440
switch (readl(&clk_power->clkdivn) & 0x6) {
default:
case 0:
return get_FCLK();
case 2:
return get_FCLK() / 2;
case 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 : get_FCLK() / 3;
}
#else
return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif } 说明现在的uboot已经支持获取s3c2440的时钟来自行计算波特率了,但需要我们在配置文件smdk2410.h中定义s3c2440的宏。因此我们就去配置: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h 修改如下: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14A1.tmp.jpg
保存,现在串口应该就可以用了,我们make下 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功并生产uboo.bin,烧写进nor flash,重启开发板,打印如下,说明串口可用了。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14B1.tmp.jpg
5,修改uboot支持nor flash继续跟着韦老师手册或者视频所讲的uboot启动流程走,我们发现nor flash的初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的flash_init()中进行,层层深入发现uboot判断如果用户定义了board_flash_get_legacy函数则采用flash_detect_legacy函数进行nor flash检测,否则用标准CFI接口进行检测,我们分别说明。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14C2.tmp.jpg
5.1 legacy检测nor flash方式Legacy检测方式是通过AMD和Intel的标准指令进行nor flash的ID读取,随后将读取的ID跟 u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\Jedec_flash.c中的jedec_table定义的器件ID进行对比,从而获取器件信息,以及该器件对应的读写控制指令集。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14C3.tmp.jpg
看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),
}
},
file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14D3.tmp.jpg
保存更改,再次make book@book-desktop:~/uboot/u-boot-2015.04-rc4$make 编译成功,将生成uboot.bin烧写进开发板,重启,打印如下:
file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14D4.tmp.jpg
由打印信息可知,现在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 修改如下: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14E5.tmp.jpg
修改函数返回值,使uboot采用CFI方式进行nor flash检测: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c 如图所示,将返回值改为0即采用CFI方式,return 1就是legacy方式,具体可查看源代码,二种方式只能取其一哦。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14F6.tmp.jpg
保存,make again!! book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写进nor flash,启动,打印如下:
file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps14F7.tmp.jpg
flash大小,扇区都正确,ok,nor flash驱动移植成功。 6,修改uboot支持nand flash 与nor flash的初始化类似,nand flash初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c 中的函数void board_init_r(gd_t *id, ulong dest_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 寄存器偏移宏定义book@book-desktop:~/uboot/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 (1<<1) file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1507.tmp.jpg
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), &nand_reg->nfcont);
file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1518.tmp.jpg
6.3修改s3c24x0_hwcontrol函数Uboot的nand驱动最重要的就是这个函数了,它实现了nand读写的最底层控制,此处修改不当直接导致nand驱动不起来,因此需要特别注意。修改如下: #if defined(CONFIG_S3C2410) if (ctrl & NAND_NCE) writel(readl(&nand->nfconf) & ~S3C2410_NFCONF_nFCE, &nand->nfconf); else writel(readl(&nand->nfconf) | S3C2410_NFCONF_nFCE, &nand->nfconf); #elif defined(CONFIG_S3C2440) if (ctrl & NAND_NCE)/* modified by chili, 2440*/ writel(readl(&nand->nfcont) & ~S3C2440_NFCONT_nFCE, &nand->nfcont); else writel(readl(&nand->nfcont) | S3C2440_NFCONT_nFCE, &nand->nfcont); #endif
file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1528.tmp.jpg
6.4编译烧写book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 编译成功,烧写启动,打印如下,说明nand驱动成功。至此就可以使用nand命令进行操作flash了 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1529.tmp.jpg
6.5 解决nand write失败经过上面一番更改,我们已经可以使用uboot自带的一些nand操作指令了,下面我们就来测试下效果如何,nand命令网上非常多资料,这种东西就可自行百度了解,其实百度上的都是别人看uboot后发上去的,那我们都可以自己看uboot帮助信息的,直接: SMDK2410 # nand file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps153A.tmp.jpg
帮助信息,说的很清楚哦,也别啥事都想到百度,自己可以想想想,解决看看。 先试试擦除,再nand dump 看下flash内数据: SMDK2410 # nand erase 100000 100000 SMDK2410 # nand dump 100000 显示如下说明erase成功: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps153B.tmp.jpg
我们准备将内存30000000数据烧写进nand中,事先先看看内存中的数据是什么,等下好对比: SMDK2410 # md 30000000 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps153C.tmp.jpg
万事具备,开始烧写nand: SMDK2410 # nand write 300000 100000 100000 SMDK2410 # nand dump 100000 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps154D.tmp.jpg
咦?明明显示写入成功,为何数据还是FF,这说明数据压根都没写进去啊,多写几次还是如此,怎么回事啊?难道uboot有问题?放心这一般不可能,一定是你自己底层驱动写的有问题。先让我们理一理我们干了什么,忘了的童孩可以把6.1-6.3节重新复习遍: 6.1 设置S3C2440寄存器偏移和片选宏。 分析:可以读,但是写不进去,这里应该没问题,否则绝对无法读取数据的。 6.2 设置nand操作时序。 分析:还是那个原理,读数据都可以,说明读时序没问题,那么是不是写时序有问题?有可能,去检查设置时序和韦老师给的uboot1.6中nand 操作时序,发现一致,说明时序肯定也没问题。 6.3 修改s3c24x0_hwcontrol底层命令控制函数 刚说这个函数很重要,是上层操作nand函数的最底层函数,ok,我们仔细看看,是不是哪里疏忽了: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps155D.tmp.jpg
在最后,添加IO_W的默认寄存器指向。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps155E.tmp.jpg
保存编译烧写,启动,测试: SMDK2410 # nand erase 100000 100000 SMDK2410 # nand dump 100000 SMDK2410 # nand write 30000000 100000 100000 SMDK2410 # nand dump 100000 擦除后数据: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps155F.tmp.jpg
写入后数据: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1570.tmp.jpg
Ok,写入成功!至此,nand flash驱动工作完全正常!
7,修改uboot支持DM9000Uboot 内核已经支持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的定义。 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1571.tmp.jpg
由于内存接口的定义跟硬件息息相关,所以驱动并没有定义,用户实际用到该驱动时,需要自己根据实际连接情况自己定义。 这种属于配置定义,所以我们就去smdk2410.h添加: book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1581.tmp.jpg
在板级初始化函数中添加dm9000的初始化函数:
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim board/samsung/smdk2410/smdk2410.c file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1582.tmp.jpg
保存,编译烧写,启动,打印如下 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps1593.tmp.jpg
根据打印提示,我们知道Dm9000a驱动成功,但是MAC地址未进行设置,下面去smdk2410.h中继续添加配置
修改配置文件 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim include/configs/smdk2410.h 添加 #define CONFIG_ETHADDR
00:02:03:04:05:06 file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps15A4.tmp.jpg
保存,烧写启动,打印如下表示我们网卡工作正常: file:///C:\Users\CHILIW~1\AppData\Local\Temp\ksohtml\wps15B4.tmp.jpg
或者直接在uboot命令行中设置ethaddr环境变量,并保存 SMDK2410 # set ethaddr 00:02:03:04:05:06 SMDK2410 # set ipaddr 192.168.1.111 SMDK2410 # set serverip 192.168.1.1 SMDK2410 # saveenv 8,总结本文通过实际log提示以及现象得出分析,一步步的修改uboot,直到完成整个移植工作,移植不是目的,希望大家在一步步的修改过程中能够学习到: 1,uboot的执行流程,知道什么东西去哪里更改(当然这需要有一定的代码阅读能力,并且对uboot源码有过仔细认真的阅读分析,代码还是要看的,这可不能偷懒哦) 2,遇到问题,分析问题和解决问题的思路方法。 其实越新的uboot做的东西就越多,我们需要更改的就越少,但是本质都一样,只要大家能够了解uboot的执行流程,知道什么东西去哪里改就很简单了。之前大家可能都写过单片机,arm程序,知道如何写寄存器设置不同的外设,那么uboot移植其实类似的,毕竟uboot只是一个裸机程序,操作方式跟普通单片机,arm一样,只是代码量大了许多,还有就是代码封装的比较深,但只要大家耐心多看几遍代码,理清uboot的控制思路,也就也没什么困难了。真的有困难也不要紧,现在是互联网时代,把你的问题放到网上求助,或者你有心得也放到网上供大家学习,这样大家通过知识的共享,就都获得了进步,世界因共享而变得美好,也让我们共同献出自己的一份绵薄之力,有问题有心得多分享!
上手JZ2440疑难排除在vmware共享文件夹下make u-boot错误错误: scripts/kconfig/conf --silentoldconfig Kconfig make[2]: Warning: File `include/config/auto.conf' has modification time 0.97 s in the future ln: creating symbolic link `arch/arm/include/asm/arch': Operation not supported make[2]: *** [create_symlink] Error 1 make[1]: *** [silentoldconfig] Error 1 make: *** No rule to make target `include/config/auto.conf', needed by `include/config/uboot.release'. Stop. 解决:由于在windows下不支持linux下的ln符号链接,因此需要将u-boot拷贝到linux文件系统下进行make apt-get 失败,一般是源有问题。报错:E: Some packages could not be authenticated
方法: 1、修改源地址: cp /etc/apt/sources.list /etc/apt/sources.list.bak vim /etc/apt/sources.list 加入如下内容(中科大的): deb http://mirrors.ustc.edu.cn/ubuntu/ precise-updates main restricted deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise-updates main restricted deb http://mirrors.ustc.edu.cn/ubuntu/ precise universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise universe deb http://mirrors.ustc.edu.cn/ubuntu/ precise-updates universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise-updates universe deb http://mirrors.ustc.edu.cn/ubuntu/ precise multiverse deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise multiverse deb http://mirrors.ustc.edu.cn/ubuntu/ precise-updates multiverse deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise-updates multiverse deb http://mirrors.ustc.edu.cn/ubuntu/ precise-backports main restricted universe multiverse deb-src http://mirrors.ustc.edu.cn/ubuntu/ precise-backports main restricted universe multiverse
比较快的源: 搜狐源: deb http://mirrors.sohu.com/ubuntu/ precise-updates main restricted deb-src http://mirrors.sohu.com/ubuntu/ precise-updates main restricted deb http://mirrors.sohu.com/ubuntu/ precise universe deb-src http://mirrors.sohu.com/ubuntu/ precise universe deb http://mirrors.sohu.com/ubuntu/ precise-updates universe deb-src http://mirrors.sohu.com/ubuntu/ precise-updates universe deb http://mirrors.sohu.com/ubuntu/ precise multiverse deb-src http://mirrors.sohu.com/ubuntu/ precise multiverse deb http://mirrors.sohu.com/ubuntu/ precise-updates multiverse deb-src http://mirrors.sohu.com/ubuntu/ precise-updates multiverse deb http://mirrors.sohu.com/ubuntu/ precise-backports main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ precise-backports main restricted universe multiverse 网易源: deb http://mirrors.163.com/ubuntu/ precise-updates main restricted deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted deb http://mirrors.163.com/ubuntu/ precise universe deb-src http://mirrors.163.com/ubuntu/ precise universe deb http://mirrors.163.com/ubuntu/ precise-updates universe deb-src http://mirrors.163.com/ubuntu/ precise-updates universe deb http://mirrors.163.com/ubuntu/ precise multiverse deb-src http://mirrors.163.com/ubuntu/ precise multiverse deb http://mirrors.163.com/ubuntu/ precise-updates multiverse deb-src http://mirrors.163.com/ubuntu/ precise-updates multiverse deb http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse 更新看看速度: sudo apt-get update sudo apt-get upgrade
Win7下Source insight破解失败解决办法(总是安装不完全:not completely)新建文本另存为 x.reg,将下列复制进去保存,双击即可解决问题
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0\Install] "SetupAdminOK"="1" "SerialNumber"="SI3US-802287-90702" "UName"=hex:76,6e,03 "UNameData"=hex:00,00,61,61 "UOrg"=hex:76,6e,03 "UOrgData"=hex:00,00,61,61
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Source Dynamics\Source Insight\3.0\Paths] "CmdShell"="C:\\Windows\\system32\\cmd.exe" "InitDir"="D:\\SourceInsight" "BackupDir"="D:\\SourceInsight\\Backup" __weak修饰符若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号。弱符号也称为weak alias(弱别名) 通过简单的例子可以看出,weak属性可以让编译器在编译的时候忽略函数未定义的错误。 未定义是foo为NULL。 $cat weak.c extern void foo() __attribute__((weak)); int main() { if (foo) foo(); } $ gcc weak.c -o weak $ ./weak $ weak alias 具有和weak symbol类似的作用。 int __centon() { return(100); } void centon() __attribute__((weak,alias(“__centon”)));
配置文件smdk2410.h定义的宏如何实现为全局宏通过根目录下的config.mk,将smdk2410.h以及一些全局头文件包含进一个新建立的config.h文件中,在make完成后出现在/include/config.h中 Uboot源文件一般都包含此头文件。
Linux开启tftp服务后,开发板连不上了?报错如下: my2410 # tftpboot 0x30000000 hello ERROR: resetting DM9000 -> not responding dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:02:03:04:05:06 could not establish link Using dm9000 device TFTP from server 192.168.1.112; our IP address is 192.168.1.222 Filename 'hello'. Load address: 0x30000000 Loading: * TFTP error: 'Access violation' (2) Not retrying..
解决办法:关闭linux防火墙 Ubuntu下关闭指令: ufw disable
结论:一般只要uboot能够ping通,那么基于网络的一些协议如tftp就没有问题,因为物理链路通过了,协议层肯定行得通。所以如果能ping通,协议连不上一般就是主机配置有问题。 u-boot-2015.04-rc4中smdk2410.h中需要配置Text地址为0#define CONFIG_SYS_TEXT_BASE 0x00 也就是说uboot编译的时候所有的连接地址都是基于0x00为起点的,因此uboot中所以汇编用到的绝对地址都是基于0x00的。 在重定向代码在arm/lib/relocate.S,中,如下所示。通过u-boot.lds定义的段地址作为拷贝的地址界线,代码中通过绝对取值方式获得地址数据(即地址宏定义的链接地址CONFIG_SYS_TEXT_BASE),然后进行拷贝。但此时程序还在flash中,如果上面宏定义CONFIG_SYS_TEXT_BASE定义在DRAM中,即用户定义如下: #define CONFIG_SYS_TEXT_BASE 0x30000000 那重定向程序将把SDRAM地址0x30000000的“代码”拷贝到RAM中,但我们的代码还在flash中,运行的代码地址是以0x00为起点的,这样定义的话uboot将启动失败,这和uboot-1.1.6是不一样的,我们之前的uboot都是将这个宏定义的地址定义在SDRAM中。
ENTRY(relocate_code)
ldr
r1, =__image_copy_start
/* r1 <- SRC &__image_copy_start */
subs
r4, r0, r1
/* r4 <- relocation offset */
beq
relocate_done
/* skip relocation */
ldr
r2, =__image_copy_end
/* r2 <- SRC &__image_copy_end */
重定向的目的地址是以DRAM的起始地址算的,在arm/lib/board.c中board_init_f中定义,如下(早期的uboot版本是以Text链接地址为目标地址的)
addr_sp = addr - TOTAL_MALLOC_LEN;
...
gd->relocaddr = addr;
gd->start_addr_sp = addr_sp;
gd->reloc_off = addr - (ulong)&_start;
MTD 分区通过设置mtdparts环境变量,设置uboot的mtd分区信息。Uboot本身分区信息没有实质作用,只是可以用分区名字代替地址进行读写。如: nand write 0x30000000 kernel 但是,mtd分区信息跟内核的启动十分相关,内核启动后,需要找到根文件系统地址,此时通过bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0获取根文件系统的mtd分区,根据内核定义的分区表(即分区对应的地址),此时内核定义死的内核分区表必须与实际烧写在flash中分区一致,否则内核将找不到文件系统。或者灵活一点,用uboot传递分区表传给内核,这样就保证了实际flash存储的东西和内核知道的一致。 Tips:在u-boot中给nand分区后是否要对应修改kernel的代码? 如果你用的是通过内核命令行给MTD层传递u-boot中的MTD分区信息,那是不需要的,在这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法) 如果你用的是把分区信息写死在内核源代码里的方法,那最好保证它和u-boot中的保持一致,即同步修改内核的相关部分代码 设置uboot分区 Set mtdparts mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
Nor flash错位连接问题nor flash器件有些16位的有A0地址线,有些16位nor flash只有从A1开始的地址线,这些器件可以和CPU相应地址线连接,而且内部操作地址和nor flash芯片datasheet的地址编码是一样的,很简单,在此只说明nor flash有A0地址线的。 此种datasheet的地址编码是根据其自身的地址线来编码的。如果错位连接到ARM,即ARM的A1连接flash的A0,那么nor flash的datasheet上的地址编码在ARM内部来说都是左移1位后的地址,也就是说如果想访问外部flash的相应地址,需要先将datasheet上定义的地址左移1位,然后进行操作,访问的才是flash的相应地址。 这个自己细细品味下就能明白,网上也很多资料说明,下面是百度文库的一篇讲的很清楚的文章,自己不懂可以去仔细看看。 http://wenku.baidu.com/link?url=26L-F6D5za9p4JaG5_82bVRDVhYX-mV7b2oZw3nN_Jba-qHtBHhpf_FB1LNujQlqfsaJy3whdel_2Mi0eDLxUOPHHCjmYKdUNuw41qCRnqm
烧写文件系统错误解决烧写jffs2文件系统进内核老是错误?解决办法 检查一下几点: 0,根文件系统构建正确,一般不会有错。 1,配置内核时是否选中支持jffs2。 2,根文件系统要烧写linux内核分区的分区表指定分区,如我自己系统的分区为: 0x00000000-0x00200000 : "kernel" 内核将此地址范围识别为mtdblock0 0x00200000-0x00a00000 : "jffs2"
内核将此地址范围识别为mtdblock1 0x00a00000-0x10000000 : "yaffs"
内核将此地址范围识别为mtdblock2 假设我们将跟文件系统烧写进了地址0xa00000,我们还需要告诉内核在那个分区。通过在bootargs中添加如下启动参数: root=/dev/mtdblock2 启动内核,咦怎么挂载失败,打印如下: Mount JFS Failure: -22 List of all partitions: 1f00 2048 mtdblock0 (driver?) 1f01 8192 mtdblock1 (driver?) 1f02 251904 mtdblock2 (driver?) No filesystem could mount root, tried: ext3 ext2 cramfs msdos vfat romfs jfs Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2) 看打印信息貌似内核尝试了很多文件系统最后失败了,那我们事先告诉他好了,在bootargs中添加 rootfstype=jffs2 rw 3,特别需要注意,刚开始我系统总是根文件系统挂载失败,检查了所有都感觉没什么错误,最后发现原来是烧写根文件系统是长度指定多了。如实际: tftp 30000000 fs_mini.jffs2 nand erase a00000 a00000 nand write.jffs2 30000000 a00000 600000
注意此处我烧写文件系统的长度是6M,实际是0x59ad78, 一个接近6M的大小,但是我烧写了6M,心想应该没问题的,不就多了嘛,都说少了不行,多了总可以吧。好吧,看内核启动后挂载文件系统现象:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0059ad78: 0xad64 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0059ad80: 0xad80 instead jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0059ad84: 0xad80 instead ......
好了,那咱还是实事求是,试试烧写实际的大小看看,再次把命令敲一遍,把最后的命令改成读取变量来获取实际长度:
tftp 30000000 fs_mini.jffs2 nand erase a00000 a00000 nand write 30000000 a00000 $filesize
噢耶!内核挂载成功,内核启动挂载打印信息: VFS: Mounted root (jffs2 filesystem). Freeing init memory: 128K init started: BusyBox v1.7.0 (2008-01-22 10:04:09 EST) starting pid 739, tty '': '/etc/init.d/rcS' ifconfig: SIOCSIFADDR: No such device mount: mounting tmpfs on /tmp failed: Invalid argument Please press Enter to activate this console. starting pid 744, tty '/dev/ttySAC0': '/bin/sh' # ls bin etc linuxrc proc sbin tmp dev lib mnt root sys usr #
未完待续。。。根据以后学习,还将会不断更新JZ2440学习笔记,敬请期待。 |