在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 15791|回复: 11

[原创] 【绝对原创干货!】韦东山JZ2440学习笔记

[复制链接]
发表于 2015-5-16 17:23:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
JZ2440学习笔记

Chili


2015.5








前言

本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114LPC1343STM32blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。靠着这点小经验,以及新学习的知识,自己动手移植了最新的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配有JlinkJlink一般来说不支持烧写nand falsh,当然可以购买百问网的Gflash,其可以通过Jlink烧写nand flash。我们一般是购买JZ2440标准配置开发板,那咱就用nor flash启动,并通过JlinkJ-Flashuboot.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应用开发完全手册》,应该知道S3C2440S3C2410时钟计算法不一样,因此我们打开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检测方式是通过AMDIntel的标准指令进行nor flashID读取,随后将读取的IDu-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读不到呢,当我把ubootDebug打开,打印出调试信息时,发现uboot检测nor flash ID0x2249,对应于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表的器件信息算出来的,但由于我这个器件信息是在原来1MMX29LV800BBTC基础上修改了一个器件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大小,扇区都正确,oknor 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

因为,S3C24402410nand控制器有些区别,时序设置需要多设置一个寄存器,而且寄存器偏移不一致,因此添加如下图所示的宏定义,添加:

#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函数设置时序

由于2440nand控制寄存器与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函数

Ubootnand驱动最重要的就是这个函数了,它实现了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.6nand 操作时序,发现一致,说明时序肯定也没问题。

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支持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的定义。

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,直到完成整个移植工作,移植不是目的,希望大家在一步步的修改过程中能够学习到:

1uboot的执行流程,知道什么东西去哪里更改(当然这需要有一定的代码阅读能力,并且对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


Win7Source 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属性可以让编译器在编译的时候忽略函数未定义的错误。

未定义是fooNULL

$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-rc4smdk2410.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.cboard_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环境变量,设置ubootmtd分区信息。Uboot本身分区信息没有实质作用,只是可以用分区名字代替地址进行读写。如:

nand write 0x30000000 kernel

但是,mtd分区信息跟内核的启动十分相关,内核启动后,需要找到根文件系统地址,此时通过bootargs=noinitrd root=/dev/mtdblock2  init=/linuxrc console=ttySAC0获取根文件系统的mtd分区,根据内核定义的分区表(即分区对应的地址),此时内核定义死的内核分区表必须与实际烧写在flash中分区一致,否则内核将找不到文件系统。或者灵活一点,用uboot传递分区表传给内核,这样就保证了实际flash存储的东西和内核知道的一致。

Tips:在uboot中给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地址线,有些16nor flash只有从A1开始的地址线,这些器件可以和CPU相应地址线连接,而且内部操作地址和nor flash芯片datasheet的地址编码是一样的,很简单,在此只说明nor flashA0地址线的。

此种datasheet的地址编码是根据其自身的地址线来编码的。如果错位连接到ARM,即ARMA1连接flashA0,那么nor flashdatasheet上的地址编码在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学习笔记,敬请期待。

发表于 2015-5-18 10:15:50 | 显示全部楼层
似乎有些冷清,来捧个场
发表于 2015-5-18 22:57:45 | 显示全部楼层
xie xie
发表于 2015-6-3 17:12:14 | 显示全部楼层
不错,值得参考..
发表于 2015-6-13 18:45:33 | 显示全部楼层
的顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
发表于 2015-8-5 15:55:53 | 显示全部楼层
不错,不过我为什么看不到图片呢,是不是因为级别不够哈。
发表于 2015-9-20 17:53:27 | 显示全部楼层
大侠 好像挺厉害的样子  我在门外徘徊了半天就是不知怎么着手
发表于 2015-9-21 14:43:21 | 显示全部楼层
支持一下,谢谢LZ分享。
发表于 2015-10-12 23:53:02 | 显示全部楼层
thanks!!!!
发表于 2016-2-25 20:22:05 | 显示全部楼层
回复 1# chiliWang


   有点意思!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 13:21 , Processed in 0.041356 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表