微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 韦东山JZ2440学习心得1

韦东山JZ2440学习心得1

时间:10-02 整理:3721RD 点击:
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/wps5CDF.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/wps5CEF.tmp.jpg

版本为3.4.5,貌似JZ2440光盘上的ubuntu上自带的交叉编译环境是比较老了,那我们网上搜索个新的,装上试试看。

在”h t p : / / dl.dbank.com / c01p81pb9i “网站有arm-linux-gcc 4.4.3下载,并有详尽的安装方法,读者可自行下载并安装。安装完成后查看版本如下,说明安装成功。

file:///C:/Users/CHILIW~1/AppData/Local/Temp/ksohtml/wps5CF0.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/wps5D01.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/wps5D12.tmp.jpg


2,修改int board_early_init_f(void)函数添加CLKdivN寄存器配置

如下:

writel(0x5, &clk_power->clkdivn);

file:///C:/Users/CHILIW~1/AppData/Local/Temp/ksohtml/wps5D13.tmp.jpg

保存,并编译,烧写,重启开发板查看现象:

file:///C:/Users/CHILIW~1/AppData/Local/Temp/ksohtml/wps5D14.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/wps5D24.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/wps5D35.tmp.jpg

本帖子中图片发送失败,严重影响阅读。请移步看另外重新发的帖子【原创连载】JZ2440学习笔记1-4,图片显示正常。

謝謝您的心得分享…

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top