|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
【社区大讲堂】顶嵌与你一起:动手做嵌入式产品缘起: eefocus与顶嵌合作,重磅推出“ 顶嵌与你一起:动手做嵌入式产品”。希望通过对一个典型嵌入式产品研发过程进行描述,让初级的嵌入式技术爱好者了解嵌入式开发过程和思路,从而提高学习效率。对于有一定开发经验的工程师,也可以通过线上、线下的互动方式,解决研发过程中面临的实际问题。 内容概要: 序
言:如何选取开发板及为什么学习嵌入式; 第一阶段:工具链编译; 第二阶段:bootloader; 第三阶段:内核移植的过程; 第四阶段:根文件系统的移植和制作; 活动日期:
三个阶段完成直至最终一个典型嵌入式开发文档大约需要六个月左右时间,资深嵌入式专家会定期发布各个技术文档。 讲座老师介绍: 欧文盛: 顶嵌( www.top-e.org)高级讲师,主要研究和工作领域是嵌入式Linux系统下的平台和应用软件开发。曾就职于摩托罗拉(中国)科技有限公司,任嵌入式高级软件工程师职位。参与开发过多款摩托罗拉手机平台(如EZX,
LJ, MOTOMAGAX等)及产品(如A1200, E2, Z6, V8,
U9等)。著作有《ARM嵌入式Linux应用实例开发》、《ARM嵌入式Linux应用开发入门》和《ARM嵌入式Linux系统开发从入门到精通》。 李亚锋: 顶嵌( www.top-e.org)高级讲师,主要研究和工作领域是嵌入式Linux系统下的设备驱动开发以及嵌入式手机系统的驱动和应用软件开发。曾先后就职于威盛电子(中国)有限公司、O2Micro北京分公司,任嵌入式高级软件工程师职位。参与开发过嵌入式网络设备驱动、手机SD卡,LCD,USB等驱动程序。著作有《ARM嵌入式Linux设备驱动实例开发》和《ARM嵌入式Linux系统开发从入门到精通》
。 如果你正在为学习嵌入式而苦恼,请加入我们吧!顶嵌助您成功!
[最后修改于2009-10-15 16:12:10]
|
|
| |
|
|
|
相关主题
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 序 言:如何选取开发板及为什么学习嵌入式; |
| |
序 言:如何选取开发板及为什么学习嵌入式; 感谢eefocus给予的宝贵交流平台,经过我们对嵌入式爱好者朋友的调查发现,好多朋友对于为什么学习嵌入式以及为什么学习嵌入式需要开发板这个基本的问题比较困惑,所以今天专门做下解答,希望对大家有所帮助。有不得当的地方,大家可以相互讨论。 一、首先简要说说为什么要学习嵌入式,为了便于大家形象的理解,我把与pc下的软件开发和嵌入式开发做个比较,大家就很直白的了解了为什么要学习嵌入式了。 pc下开发VS嵌入式Linux开发: pc下开发特点:都被微软等软件巨头企业开发殆尽,程序员工作相对简单,对于软件公司来说开发成本高一些,不开源看不到源代码决定了可扩展性不够强; 嵌入式Linux开发特点:开源利于学习及扩展,技术支持也很强大,免费开源软件对于企业来说成本很低,代码能够直接看到对于很多人来说有些难度,进入门槛有一定要求,决定了就业潜力比较强大,待遇也较pc下开发要高。 通过以上简要的比较,大家应该基本理解了为什么目前要学习嵌入式了。 二、下面说说为什么学习嵌入式需要开发板: 这么说可能大家就比较通俗易懂了:比如你做嵌入式手持设备的研发,在出产品前,必须要在实验板上做好调试,然后交由代工厂进行生产加工,不太可能开始的时候先设计好产品,然后再做调试和研发。由此就决定了嵌入式研发或学习必须需要开发板。 三、顺便再说说如何选购arm开发板,仅从四个方面阐述: 1、CPU:arm7和arm9,目前arm7已经比较少了,最为普及的应该还是arm9,arm9的好处是可以跑标准的Linux操作系统,这方面ARM9比ARM7更有优势。 2、嵌入式操作系统:常见的操作系统有Linux,WINCE,UCOS-II,VXWORKS等,目前用的比较普遍的是Linux操作系统,好多企业都首选它,优点是:成本低、开源、扩展性好等;图形界面就不必说了。关键看提供不提供源码,有现成的源码,自己编译起来会方便的多。 3、硬件设备:硬件设备很少的开发板,不适合学习。所以大家选择开发板的时候一定要注意提供的硬件器件主要看下面几个方面:(1)看flash
sdram容量。(2)看有没有nand
flash。(3)usb的是否支持主从。(4)外围接口丰富不,例如vga,sd卡等等。如有的2410开发板,接口就比较丰富,此外值得注意的是:很多板子上有些接口都是摆设,大家在购买的时候务必先确认一下! 4、售后服务:技术的提升关键还要看自己,当然技术支持也很重要,有一个好的技术支持会起到事半功倍的效果。此处值得注意的是:选择一些自己研发的开发板厂家的话,技术服务会好很多,至少人家技术支持的人专业。
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:47
帖子:37
精华:0
等级:学徒
注册时间:2008-06-10
最后登录:2010-03-20 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
顶一个先
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:29
帖子:16
精华:0
等级:学徒
注册时间:2009-08-06
最后登录:2009-09-15 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
 顶起来先
|
|
| |
|
|
|
一直在很努力的忘记
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
第一阶段:工具链编译之第一部分(抱歉来晚了)Crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。Crosstool最初是为嵌入式系统开发者创建,但也适用于主流开发者比如只是希望他们去快速编译或需要建立程序,可运行在旧版本的Linux操作系统(例如Red Hat的6.2 )。Crosstool是一种便携式的shell脚本。你可以使用它来建立Linux系统配置的编译器是运行在Linux , Mac OS X操作系统, Solaris和Cygwin等。它支持的硬件平台有:alpha, arm, i686, ia64, mips, powerpc, powerpc64, sh4, sparc,
sparc64, s390, x86_64等。在实践之前,我们需要回答这样的问题,为什么要使用交叉编译器?主要原因是嵌入式硬件(目标机)的性能一般都无法满足开发环境的要求,比如主频比较低、内存少、没有硬盘(常用FLASH作为存储设备)、没有大型显示设备、没有全键盘等。交叉编器通常是采用PC(x86)作为主机来搭建开发环境进行编译,但编译出的软件能够在特定CPU体系架构的目标设备(比如ARM设备)上运行的一套编译工具。下面将以具体操作步骤来讲述Crosstool构建针对ARM平台的交叉编译器。注:该实验是基于Fedora 10操作系统下进行,其他Linux发行版可能会有所不同。1.准备资源文件软件包名称 | 下载站点 | crosstool-0.43.tar.gz | http://kegel.com/crosstool/crosstool-0.43.tar.gz | binutils-2.15.tar.bz2 | http://ftp.gnu.org/gnu/binutils/ | gcc-3.4.5.tar.bz2 | http://ftp.gnu.org/gnu/gcc | glibc-2.3.6.tar.bz2 | http://ftp.gnu.org/gnu/glibc | glibc-linuxthreads-2.3.6.tar.bz2 | http://ftp.gnu.org/gnu/glibc | linux-2.6.28.2.tar.bz2 | http://ftp.kernel.org/pub/linux/kernel/v2.6/ | linux-libc-headers-2.6.12.0.tar.bz2 | http://ep09.pld-linux.org/~mmazur/linux-libc-headers/ | 首先从网上下载上述资源文件:binutils-2.15.tar.bz2,gcc-3.4.5.tar.bz2,glibc-2.3.6.tar.bz2 ,glibc-linuxthreads-2.3.6.tar.bz2,linux-2.6.28.2.tar.bz2和linux-libc-headers-2.6.12.0.tar.bz2。然后将这些工具包文件放在开放主机的/home/mike/downloads目录(该目录根据个人使用习惯不同可修改)下,最后在/home/mike目录下解压crosstool-0.43.tar.gz,命令如下:# cd /home/mike # tar –xvzf crosstool-0.43.tar.gz | 2建立脚本文件接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模版,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:# cd crosstool-0.43 # cp demo-arm.sh arm.sh # vi arm.sh | 修改后的arm.sh的脚本内容如下:#!/bin/sh set -ex TARBALLS_DIR=/home/mike/downloads # 定义工具链源码所存放位置。 RESULT_TOP=/opt/crosstool # 定义工具链的安装目录 export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" # 定义支持C, C++语言 export GCC_LANGUAGES # 创建/opt/crosstool目录 mkdir -p $RESULT_TOP # 编译工具链,该过程需要数小时完成。 eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest echo Done. |
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
第一阶段:工具链编译之第二部分(抱歉来晚了)#!/bin/sh set -ex TARBALLS_DIR=/home/mike/downloads # 定义工具链源码所存放位置。 RESULT_TOP=/opt/crosstool # 定义工具链的安装目录 export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" # 定义支持C, C++语言 export GCC_LANGUAGES # 创建/opt/crosstool目录 mkdir -p $RESULT_TOP # 编译工具链,该过程需要数小时完成。 eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest echo Done. | 3 建立配置文件在arm.sh脚本文件中需要注意arm.dat和gcc-3.4.5-glibc-2.3.6.dat两个文件,这两个文件是作为crosstool的编译的配置文件。其中arm.dat文件内容如下,主要用于定义配置文件,定译生成编译工具链的名称以及定义编译选项等。KERNELCONFIG=`pwd`/arm.config # 内核的配置 TARGET=arm-linux # 编译生成的工具链名称 TARGET_CFLAGS="-O" # 编译选项 | gcc-3.4.5-glibc-2.3.6.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果当在编译过程中发现有些库不存在时,crosstool会自动在相关网站上下载,该工具在这点上相对非常智能,也非常有用。BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.5 GLIBC_DIR=glibc-2.3.6 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6 LINUX_DIR=linux-2.6.28.2 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 | 4 执行脚本将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉变异工具。具体执行命令如下:# cd crosstool-0.43 # ./arm.sh | 经过数小时的漫长编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin目录下生成新的交叉编译工具,其中包括以下内容:arm-linux-addr2line arm-linux-g++ arm-linux-ld
arm-linux-size arm-linux-ar
arm-linux-gcc
arm-linux-nm
arm-linux-strings arm-linux-as arm-linux-gcc-3.4.5
arm-linux-objcopy arm-linux-strip arm-linux-c++ arm-linux-gccbug
arm-linux-objdump fix-embedded-paths arm-linux-c++filt arm-linux-gcov arm-linux-ranlib arm-linux-cpp
arm-linux-gprof
arm-linux-readelf
| 5 添加环境变量然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统~/ .bash_profile文件中添加下面一行在文件的最后,如图所示。export
PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH |
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
第一阶段:工具链编译之第三部分(抱歉来晚了) 图 用Vi编辑器在.bash_profile文件中添加环境变量
设置完环境变量,也就意味着交叉编译工具链已经构建完成,然后就可以进行测试刚刚建立的工具链,在命令行输入arm-linux-gcc看是否有输入文件提示,如果有说明交叉编译器已经安装好。 实践出现的问题及解决方法: 问题一:执行.arm.sh出现如下权限错误? [root@localhost
crosstool-0.43]# ./arm.sh +
TARBALLS_DIR=/home/mike/downloads + RESULT_TOP=/opt/crosstool + export TARBALLS_DIR
RESULT_TOP + GCC_LANGUAGES=c,c++ + export GCC_LANGUAGES + mkdir -p /opt/crosstool ++ cat arm.dat
gcc-3.4.5-glibc-2.3.6.dat + eval
'KERNELCONFIG=`pwd`/arm.config' TARGET=arm-linux
'TARGET_CFLAGS="-O"' BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6 LINUX_DIR=linux-2.6.28.2
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 sh all.sh --notest +++ pwd ++
KERNELCONFIG=/home/mike/crosstool-0.43/arm.config ++ TARGET=arm-linux ++ TARGET_CFLAGS=-O ++ BINUTILS_DIR=binutils-2.15 ++ GCC_DIR=gcc-3.4.5 ++ GLIBC_DIR=glibc-2.3.6 ++ LINUX_DIR=linux-2.6.28.2 ++
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 ++
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 ++ sh all.sh --notest You set both LINUX_DIR and
LINUX_SANITIZED_HEADER_DIR - ignoring LINUX_DIR for the build DEJAGNU not set, so not
running any regression tests GCC_EXTRA_CONFIG not set, so
not passing any extra options to gcc's configure script GLIBC_ADDON_OPTIONS not set,
so building all glibc add-on's +
TOOLCOMBO=gcc-3.4.5-glibc-2.3.6 ++ pwd +
BUILD_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 ++ pwd +
TOP_DIR=/home/mike/crosstool-0.43 + test -z '' +
SRC_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 + echo 'SRC_DIR not set, so
source tarballs will be unpacked in the build directory' SRC_DIR not set, so source
tarballs will be unpacked in the build directory + abort 'Don'\''t run all.sh
or crosstool.sh as root, it'\''s dangerous' + echo 'Don'\''t' run all.sh
or crosstool.sh as root, 'it'\''s' dangerous Don't run all.sh or
crosstool.sh as root, it's dangerous + exec false [root@localhost
crosstool-0.43]# 解决办法: [root@localhost
crosstool-0.43]# su mike //切换到普通用户mike [mike@localhost
crosstool-0.43]$ ./arm.sh +
TARBALLS_DIR=/home/mike/downloads + RESULT_TOP=/opt/crosstool + export TARBALLS_DIR
RESULT_TOP + GCC_LANGUAGES=c,c++ + export GCC_LANGUAGES + mkdir -p /opt/crosstool ++ cat arm.dat
gcc-3.4.5-glibc-2.3.6.dat + eval
'KERNELCONFIG=`pwd`/arm.config' TARGET=arm-linux
'TARGET_CFLAGS="-O"' BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6 LINUX_DIR=linux-2.6.28.2
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 sh all.sh --notest +++ pwd ++
KERNELCONFIG=/home/mike/crosstool-0.43/arm.config ++ TARGET=arm-linux ++ TARGET_CFLAGS=-O ++ BINUTILS_DIR=binutils-2.15 ++ GCC_DIR=gcc-3.4.5 ++ GLIBC_DIR=glibc-2.3.6 ++ LINUX_DIR=linux-2.6.28.2 ++
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 ++
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 ++ sh all.sh --notest You set both LINUX_DIR and
LINUX_SANITIZED_HEADER_DIR - ignoring LINUX_DIR for the build DEJAGNU not set, so not
running any regression tests GCC_EXTRA_CONFIG not set, so
not passing any extra options to gcc's configure script GLIBC_ADDON_OPTIONS not set,
so building all glibc add-on's +
TOOLCOMBO=gcc-3.4.5-glibc-2.3.6 ++ pwd +
BUILD_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 ++ pwd +
TOP_DIR=/home/mike/crosstool-0.43 + test -z '' +
SRC_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 + echo 'SRC_DIR not set, so
source tarballs will be unpacked in the build directory' SRC_DIR not set, so source
tarballs will be unpacked in the build directory + test -w /tmp +
TARBALLS_DIR=/home/mike/downloads + RESULT_TOP=/opt/crosstool +
PREFIX=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux + export TOOLCOMBO + export PREFIX + export BUILD_DIR + export SRC_DIR + export TARBALLS_DIR + export TOP_DIR + '[' 1 -gt 0 ']' + opt_no_test=1 + shift + '[' 0 -gt 0 ']' + test '' = 1 + test '' = '' + test '' = 1 + test -d
/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 + mkdir -p
/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6 mkdir: cannot create
directory `/home/mike/crosstool-0.43/build': Permission denied [mike@localhost
crosstool-0.43]$ su Password: [root@localhost
crosstool-0.43]# ./arm.sh
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
给大家补补Linux指令吧Linux指令速成 在书店和网络中会有许多关于linux操作指令的书籍和页面,许多介绍的都很全面,我们要想系统的掌握这方面的知识,这些资料是很不错的选择。但是作为一个初学着,或者想要在较短的时间内就能简单的应用linux,这样做似乎会比较慢,其实我们大可不必储备很多操作知识才去进行应用,就像我们学习认字一样,当我们学的字还很少时,我们虽然写不成文章,但是我们可以组词、造句子、写便条、识别一些简单的标识。这也符合2/8法则说的那样,在这些指令中有80%是我们不常用到的,常用的只有20%,我们就可以把这80%的深入内容稍后学习,先学习那20%的常用内容,就可以进行应用。在应用中加强所学的知识,同时再慢慢学习剩下的那80%的内容,这样即实现了尽快上手又能在实践中加强所学的内容。初学者要注意几个问题:linux指令的使用要涉及到权限问题,因为linux支持多用户模式这样会造成一定混乱,所以要设置用户的权限,一些管理命令只有root用户可以使用,例如:userad、userdel等。或者当我们想在非用户目录下实现一些有权限许可的操作时也会受到限制,例如:我们是一个普通用户先要在其它用户的私有文件夹下建立文件,虽然普通用户有mkdir指令的使用权限,但是在其它用户的私有目录下是不能使用的。其次linux还涉及参数的使用可以实现不同的功能。下面就我的学习经验简单介绍一下一些linux的必备指令。我把所学的指令大体分为四个方面:系统管理、磁盘管理、文件管理、其它。一.系统管理通常的系统管理工作主要是:开关机管理、用户管理、进程管理以及一些信息查看1.halt权限:系统管理者格式 :halt -参数功能 :若系统的 runlevel 为 0 或 6 ,则关机,否则以 shutdown 指令(加上 -h 参数)来取代参数: -n : 在关机前不做将记忆体资料写回硬盘的动作 -w : 并不会真的关机,只是把记录写到 /var/log/wtmp 档案里 -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d) -f : 强迫关机,不呼叫 shutdown 这个指令 -i : 在关机之前先把所有网络相关的装置先停止 -p : 当关机的时候,顺便做关闭电源(poweroff)的动作 示例: halt -p 关机后关闭电源。 halt -d 关机但不留下纪录。2.reboot权限:系统管理者格式 :reboot –参数功能 :若系统的 runlevel 为 0 或 6 ,则重新开机,否则以 shutdown 指令(加上 -r 参数)来取代参数: -n : 在重开机前不做将记忆体资料写回硬盘的动作 -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里 -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d) -f : 强迫重开机,不呼叫 shutdown 这个指令 -i : 在重开机之前先把所有网络相关的装置先停止示例: reboot 重开机。 reboot -w 做个重开机的模拟(只有纪录并不会真的重开机)。
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
3. shutdown
权限 : 系统管理者 格式 : shutdown [-t seconds] [-rkhncfF] time [message] 功能 : shutdown 可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。 参数 :
-t seconds : 设定在几秒钟之后进行关机程序 -k : 并不会真的关机,只是将警告讯息传送给所有只用者 -r : 关机后重新开机 -h : 关机后停机 -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机 -c : 取消目前已经进行中的关机动作 -f : 关机时,不做 fcsk 动作(检查 Linux 档系统) -F : 关机时,强迫进行 fsck 动作 time : 设定关机的时间 message : 传送给所有使用者的警告讯息
4.adduser
权限 :系统管理员 格式 :adduser –参数 相应内容 功能 :新增使用者帐号或更新预设的使用者资料 参数 : -c comment 新使用者位于密码档(通常是 /etc/passwd)的注解资料 -d home_dir 设定使用者的家目录为 home_dir ,预设值为预设的 home 后面加上使用者帐号 loginid -e expire_date 设定此帐号的使用期限(格式为 YYYY-MM-DD),预设值为永久有效 -f inactive_time adduser是增加使用者. 相对的,也有删除使用者的指令,userdel. 语法:userdel [login ID]
5.su 权限:所有使用者 格式:su –参数 相应的内容
说明:变更为其他使用者的身份,除 root 外,需要键入该使用者的密码 参数: -f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh -m -p 或 --preserve-environment 执行 su 时不改变环境变数 -c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者 -s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell --help 显示说明文件 --version 显示版本资讯 - -l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root USER 欲变更的使用者帐号 ARG 传入新的 shell 参数 示例: su -c ls root 变更帐号为 root 并在执行 ls 指令后退出变回原使用者。 su root -f 变更帐号为 root 并传入 -f 参数给新执行的 shell。 su - clsung 变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)。
6.ps 权限:所有使用者 格式:ps [options] [--help] 功能:显示瞬间行程 (process) 的动态 参数:ps 的参数也是非常多的, 在此仅列出几个常用的参数 -A 列出所有的行程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显示所有包含其他使用者的行程 示例: ps 7.top 权限:所有使用者 格式:top [-] [d delay] [q] [c] [S] [s] [n] 功能:实时显示 process 的动态 参数: d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行 c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
3. shutdown
权限 : 系统管理者 格式 : shutdown [-t seconds] [-rkhncfF] time [message] 功能 : shutdown 可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。 参数 :
-t seconds : 设定在几秒钟之后进行关机程序 -k : 并不会真的关机,只是将警告讯息传送给所有只用者 -r : 关机后重新开机 -h : 关机后停机 -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机 -c : 取消目前已经进行中的关机动作 -f : 关机时,不做 fcsk 动作(检查 Linux 档系统) -F : 关机时,强迫进行 fsck 动作 time : 设定关机的时间 message : 传送给所有使用者的警告讯息
4.adduser
权限 :系统管理员 格式 :adduser –参数 相应内容 功能 :新增使用者帐号或更新预设的使用者资料 参数 : -c comment 新使用者位于密码档(通常是 /etc/passwd)的注解资料 -d home_dir 设定使用者的家目录为 home_dir ,预设值为预设的 home 后面加上使用者帐号 loginid -e expire_date 设定此帐号的使用期限(格式为 YYYY-MM-DD),预设值为永久有效 -f inactive_time adduser是增加使用者. 相对的,也有删除使用者的指令,userdel. 语法:userdel [login ID]
5.su 权限:所有使用者 格式:su –参数 相应的内容
说明:变更为其他使用者的身份,除 root 外,需要键入该使用者的密码 参数: -f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh -m -p 或 --preserve-environment 执行 su 时不改变环境变数 -c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者 -s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell --help 显示说明文件 --version 显示版本资讯 - -l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root USER 欲变更的使用者帐号 ARG 传入新的 shell 参数 示例: su -c ls root 变更帐号为 root 并在执行 ls 指令后退出变回原使用者。 su root -f 变更帐号为 root 并传入 -f 参数给新执行的 shell。 su - clsung 变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)。
6.ps 权限:所有使用者 格式:ps [options] [--help] 功能:显示瞬间行程 (process) 的动态 参数:ps 的参数也是非常多的, 在此仅列出几个常用的参数 -A 列出所有的行程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显示所有包含其他使用者的行程 示例: ps 7.top 权限:所有使用者 格式:top [-] [d delay] [q] [c] [S] [s] [n] 功能:实时显示 process 的动态 参数: d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行 c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
给大家补补Linux指令吧(续)s : 安全模式,将交谈式指令取消, 避免潜在的危机 i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
n : 更新的次数,完成后将会退出 top b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top
的结果输出到档案内 示例: top -n 10 8.kill 权限:所有使用者 格式: kill [ -s signal | -p ] [ -a ] pid ... kill
-l [ signal ] 功能:kill 送出一个特定的信号 (signal) 给行程 id 为 pid
的行程根据该信号而做特定的动作, 若没有指定, 预设是送出终止 (TERM) 的信号 参数: -s (signal) :
其中可用的讯号有 HUP (1), KILL (9), TERM (15), 分别代表著重跑, 砍掉, 结束; 详细的信号可以用
kill -l -p : 印出 pid , 并不送出信号 -l (signal) : 列出所有可用的信号名称 示例:
kill -9 323(将 pid 为 323 的行程关闭(kill) ) kill -HUP 456(将 pid 为 456
的行程重启(restart) ) 9.who 权限: 所有使用者都可使用 格式: who - [husfV] [user] 功能:
显示系统中有那些使用者正在上面,显示的资料包含了使用者 ID,使用的终端机,从那边连上来的,上线时间,呆滞时间,CPU
使用量,动作等等。 参数: -h : 不要显示标题列 -u : 不要显示使用者的动作/工作 -s : 使用简短的格式来显示
-f : 不要显示使用者的上线位置 -V : 显示程序版本
二.磁盘管理 通常的磁盘管理工作主要是进入磁盘、查看磁盘内容、查看磁盘空间等。 1. cd 权限 :所有使用者 格式 :cd [dirName] 功能 :变换工作目录至 dirName。 其中 dirName
表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login
时所在的目录)。是linux中使用频率非常高的指令。 说明 :"~" 表示为根目录,"." 则是表示当前目录,".."
则表示前一级目录。 示例 :cd /usr/bin(跳到 /usr/bin/ )
cd ~ (跳到自己的 home directory ) 2.ls 权限 :所有使用者 格式 :ls [-alrtAFR] [name...] 功能
:显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。 参数 : -a 显示所有档案及目录
(ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出) -l
除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出 -r 将档案以相反次序显示(原定依英文字母次序) -t
将档案依建立时间之先后次序列出 -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录) -F
在列出的档案名称后加一符号;例如可执行档则加 "*", 目录则加 "/" -R 若目录下有档案,则以下之档案亦皆依序列出 示例:
ls –l (显示当前目录下的详细资料) ls –a (显示当前目录的文件,包括隐藏文件)
3.pwd 功能 :显示当前所在的工作目录的绝对路径。格式 :pwd [--help][--version]
参 数: --help 在线帮助。 --version 显示版本信息。
4.df 权限 :所有使用者> 格式 :df [选项]... [FILE]... 功能
:显示档案系统的状况,或是看所有档案系统的状况(预设值) 5.du 功能 :显示指定的目录或文件所占用的磁盘空间。格式
:du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件]参数: -a或-all 显示目录中个别文件的大小。 -b或-bytes 显示目录或文件大小时,以byte为单位。 -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。 -D或--dereference-args 显示指定符号连接的源文件大小。 -h或--human-readable 以K,M,G为单位,提高信息的可读性。 -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。 -k或--kilobytes 以1024 bytes为单位。 -l或--count-links 重复计算硬件连接的文件。 -L<符号连接>或--dereference<符号连接> 显示选项中所指定符号连接的源文件大小。 -m或--megabytes 以1MB为单位。 -s或--summarize 仅显示总计。 -S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。 -x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。 -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。 --exclude=<目录或文件> 略过指定的目录或文件。 --max-depth=<目录层数> 超过指定层数的目录后,予以忽略。 --help 显示帮助。 --version 显示版本信息。
6. mkdir 权限:于目前目录有适当权限的所有使用者 格式:mkdir [-p] dirName 功能:建立名称为 dirName
之子目录。 参数:-p 确保目录名称存在,不存在的就建一个。 示例: mkdir AAA (在工作目录下,建立一个名为 AAA
的子目录 ) 7. mount 权限 : 系统管理者或/etc/fstab中允许的使用者 格式 : mount [-hV] mount -a
[-fFnrsvw] [-t vfstype] mount [-fnrsvw] [-o options [,...]]
device | dir mount [-fnrsvw] [-t vfstype] [-o options] device dir
功能 : 用于挂载包括文件、磁盘等。 参数 ;
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
下面进行第二阶段:bootloader (1)一. BootLoader简介 应用程序 | 文件系统 | 操作系统内核 | BootLoader |
简单的说bootloader是一段程序,它的作用就是加载操作系统,BootLoader(引导加载程序)是系统加电后运行的 第一段软件代码。通过这段代码实现硬件的初始化,建立内存空间的映射图,为操作系统内核准备好硬件环境并引导内核的启动。如右图所示的那样在设备的启动过程中bootloader位于最底层,首先被运行来引导操作系统运行,很容易可以看出
bootloader是底层程序所以它的实现严重地依赖于硬件,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,一些功能强大、支持硬件环境较多的BootLoader也被广大的使用者和爱好者所支持,从而形成了一些被广泛认可的、较为通用的的bootloader实现。简单的介绍几种: 1.U-BOOT(下载地址http://sourceforge.net/projects/u-boot) uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从下载
U-BOOT是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案,从官方版本
0.3.2开始全面支持SC系列单板机。u-boot是一个开源的bootloader。 2.vivi(下载地址http://www.mizi.com/developer) vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。
Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这是vivi的默认模式。如果修改或更新需要进入下载模式,在下载模式下,vivi为用户提供一个命令行接口通过接口可以使用vivi提供的一些命令,来实现flash的烧写、管理、操作mtd分区信息、启动系统等功能。 其它还有一些bootloader实现如下表所示:名称 | 说明 | 支持的架构 | LILO | Linux的磁盘引导加载程序 | x86 | GRUB | LILO的GNU版本 | x86 | Loadlin | 从DOS引导Linux | x86 | RedBoot | 以eCos为基础的引导程序 | x86 、ARM、PowerPC、MIPS等 | ROLO | 从ROM引导Linux,且不需要BIOS | x86 | Etherboot | 从以太网卡启动Linux系统的固件 | x86 | LinuxBIOS | 以Linux为基础的BIOS的替代品 | x86 | blob | 来自LART计划的引导程序 | ARM | 由于u-boot的通用性好,功能全面,适合初学者学习和使用,我们选用u-boot作为基准代码,在此基础上进行修改,完成移植工作。二.移植准备1.目标板:这是进行U-Boot移植首先要明确的。可以根据目标板上CPU、FLASH、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的U-Boot支持板为移植参考板。 以上图片是本次移植所用到的开发板实物图一些重要参数如下:CPU处理器– Samsung S3C2440AL,主频400MHz,最高533MHz。SDRAM内存– 板载64MB SDRAM– 32bit数据总线– SDRAM时钟频率高达100MHz– Hynix809EFlash存储器– 板载64MB Nand Flash,掉电非易失– 板载2MB Nor FlashK9F1208u00
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
– 网卡 – DM9000EP DM9 2.源文件: 选择一标准的u-boot代码:u-boot-1.1.63.烧写工具:u-boot的烧写使用JTAG线进行下载,用SJF2440.exe软件进行烧写,使用DNW终端进行串口调试。用串口线相连。4.知识储备:u-boot的目录结构:目录 | 说明 | board | 和一些已有开发板有关的文件,比如makefile和U-Boot.ldS等都和具体开发板的硬件和地址分配有关。 | common | 与体系结构无关的文件,实现各种命令的C文件 | cpu | CPU相关文件,其中的子目录都是以U-Boot所支持的CPU为名,比如子目录arm926ejS、mips等,每个特定的子目录都包括cpu.c和interrupt.c,start.s。其中cpu.c初始化CPU、设置指令cache和数据cache等。Interruput.c设置系统的各种中断和异常;start.s是U-Boot自动执行时的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。 | disk | Disk驱动的分区处理代码 | doc | 文档 | drivers | 通用设备驱动程序,例如各种网卡、支持CFI的Flash、串口、USB等 | fs | 支持文件系统的文件,目前支持cramfs、fat、fdos、jffs2和registerfs | include | 头文件,还有对各种硬件平台支持的汇编文件,系统配置文件等 | net | 与网络有关的代码,BOOTP协议、TFTP协议、RARP和NFS等 | lib_arm | 与ARM体系结构相关的代码 | tools | 创建S-Record格式文件和U-Boot images的工具 | u-boot代码:由于代码比较庞大,只简单分析启动部分。网络和书很多书中有详细的分析,如果想详细了解查阅相关资料,或着提出讨论,还可以登陆顶嵌公司网站技术文档里查看。网址:http://www.top-e.org/jiaoshi/html/?320.html
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:2
帖子:6
精华:0
等级:学徒
注册时间:2009-09-03
最后登录:2009-09-03 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
好文章,收藏了
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:26
帖子:13
精华:0
等级:学徒
注册时间:2007-06-22
最后登录:2009-09-11 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
不错的东西,收藏一下
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:2
帖子:2
精华:0
等级:学徒
注册时间:2009-10-10
最后登录:2009-10-10 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
收藏了
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:11
帖子:6
精华:0
等级:学徒
注册时间:2009-10-11
最后登录:2009-10-14 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
 很好的文章,楼主辛苦了!
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
bootloader (2)U-Boot启动过程可以分成两个阶段(stage)
下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段
 第一阶段(stage 1)是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。设置时钟(FCLK,HCLK,PCLK)、清空I/D cache、清空TLB、禁止MMU和cache、配置内存控制器、为搬运代码做准备、搬移uboot映像到RAM中(使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。第二阶段(stage 2)通常用C语言来实现。start_armboot():一系列初始化(cpu, 板卡,中断,串口,控制台等),开启I/D cache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查bootdelay和bootcmd环境变量,如果bootcmd已经设置过,则在等待bootdelay个毫秒后会自动执行bootcmd。如果等待过程中被用户中断(ctl+c)或者bootcmd没有设置,则会等待用户输入命令。关键点一:U-Boot移植参考板这是进行U-Boot移植首先要明确的。可以根据目标板上CPU、FLASH、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的U-Boot支持板为移植参考板。对U-Boot移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移植参考板的名称,在逐步熟悉U-Boot移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如 grep –r 2410 ./ 可确定出在U-Boot中与smdk2410板有关的代码,依此对照目标板实际进行屏蔽或修改。同时应不局限于移植参考板中的代码,要广泛借鉴U-Boot 中已有的代码更好地实现一些具体的功能。关键点二:U-Boot烧写地址和CPU寄存器参数设置不同目标板,对U-Boot在FLASH中存放地址要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关。也就是说,U-Boot烧写具体位置是由硬件决定的,而不是程序设计来选择的。根据CPU处理器系列、类型不同,寄存器名称与作用有一定差别。必须根据目标板的实际,进行合理配置。一个较为可行和有效的方法,就是借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费时间和考验耐力的过程,需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。关键点三:串口调试。能从串口输出信息,即使是乱码,也可以说U-Boot移植取得了实质性突破。依据笔者调试经历,串口是否有输出,除了与串口驱动相关外,还与FLASH相关的寄存器设置有关。因为U-Boot是从FLASH中被引导启动的,如果 FLASH设置不正确,U-Boot代码读取和执行就会出现一些问题。因此,还需要就FLASH的相关寄存器设置进行一些参数调试。同时,要注意串口收发芯片相关引脚工作波形。依据笔者调试情况,如果串口无输出,有一种可能就是该芯片损坏或工作不正常。如果出现乱码,有一种可能就是波特率等参数设置有问题。三.修改源代码:1.添加新开发板信息(1)顶层Makefile:为了能让u-boot在编译之前根据此规则来获得具体的配置文件和编译规则。在smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL
s3c24x0之后,添加以下内容:tq2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t tq2440 NULL
s3c24x0 | 添加交叉编译器路径(根据个人情况):ifeq ($(ARCH),arm) CROSS_COMPILE= /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin/arm-softfloat-linux- endif | (2)建立新开发板目录:可以把类似的开发板进行修改cd boardmkdir tq2440cd tq2440cp -arf ../smdk2410/* .mv smdk2410.c tq2440.c(3)修改 board/tq2440/u-boot.lds在cpu/arm920t/start.o(.text)后添加:| board/tq2440/boot_init.o (.text) | 并在tq2440目录下新建boot_init.c文件,内容参考源文件,该代码主要实现了CopyCode2Ram函数,该函数功能是拷贝flash代码到sdram中,实现原理如下图。 CopyCode2Ram函数实现原理(4)修改tq2440目录下的MakefileCOBJS := tq2440.o flash.o boot_init.o | (5)修改tq2440.c增加宏定义:#define S3C2440_MPLL_400MHZ
((0x7f<<12)|(0x02<<4)|(0x01))#define S3C2440_UPLL_48MHZ
((0x38<<12)|(0x02<<4)|(0x02))
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
S3C2440的主时钟源来自外部晶振(XTIPLL)或外部时钟(EXTCLK)。S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。
【1】MPLL, 用于产生FCLK, HCLK, PCLK三种频率, 这三种频率分别有不同的用途: FCLK是CPU提供的时钟信号。 HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。 从S3C2440的DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作频率。 PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。
【2】UPLL,专门用于驱动USB host/Device。并且驱动USB host/Device的频率必须为48MHz。 如果要设置MPLL和UPLL,要注意它们的先后顺序,MPLL和UPLL的设定是有前后顺序的,必须先设定UPLL,然后才能设定MPLL,而且中间需要大约7个空指令(NOP)的间隔。 定义MPLL/UPLL/CLKDIV,参考S3C2440芯片用户手册,参考255页内容如下:
 #define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8 */ 该寄存器参考内如下:

复制内容到剪贴板 代码:int board_init (void) { S3C24X0_CLOCK_POWER * const
clk_power = S3C24X0_GetBase_CLOCK_POWER(); S3C24X0_GPIO * const gpio =
S3C24X0_GetBase_GPIO();
/* FCLK:HCLKCLK = 1:4:8 */ clk_power->CLKDIVN =
S3C2440_CLKDIV; /* change to asynchronous bus
mod */ __asm__(
"mrc p15, 0, r1, c1, c0, 0\n" /* read
ctrl register */
"orr r1,
r1, #0xc0000000\n" /* Asynchronous
*/
"mcr p15,
0, r1, c1, c0, 0\n" /* write ctrl
register */
:::"r1"
);
/* to reduce PLL lock time,
adjust the LOCKTIME register */ clk_power->LOCKTIME =
0xFFFFFF;
/* configure MPLL */ clk_power->MPLLCON =
S3C2440_MPLL_400MHZ;
/* some delay between MPLL
and UPLL */ delay (4000);
/* configure UPLL */ clk_power->UPLLCON =
S3C2440_UPLL_48MHZ;
/* some delay between MPLL
and UPLL */ delay (8000);
/* set up the I/O ports */ gpio->GPACON = 0x007FFFFF; gpio->GPBCON = 0x00044555; gpio->GPBUP = 0x000007FF; gpio->GPCCON = 0xAAAAAAAA; gpio->GPCUP = 0x0000FFFF; gpio->GPDCON = 0xAAAAAAAA; gpio->GPDUP = 0x0000FFFF; gpio->GPECON = 0xAAAAAAAA; gpio->GPEUP = 0x0000FFFF; gpio->GPFCON = 0x000055AA; gpio->GPFUP = 0x000000FF; gpio->GPGCON = 0xFF95FFBA; gpio->GPGUP = 0x0000FFFF; gpio->GPHCON = 0x002AFAAA; gpio->GPHUP = 0x000007FF;
/* arch number of
SMDK2410-Board */ gd->bd->bi_arch_number
= MACH_TYPE_S3C2440;
/* adress of boot parameters
*/ gd->bd->bi_boot_params
= 0x30000100;
icache_enable(); dcache_enable();
return 0; }
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
(6)lowlevel_init.S #define B1_BWSCON
(DW32) 修改为 #define B1_BWSCON
(DW16) #define B5_BWSCON
(DW16) 修改为 #define B5_BWSCON
(DW8) #define REFCNT
1113 /* period=15.6us, HCLK=60Mhz,
(2048+1-15.6*60) */ 修改为 #define REFCNT
0x4f4/*period=7.8125us,HCLK=100Mhz,
(2048+1-7.8125*100) */
二. 头文件修改 include/configs/tq2440.h (1) cp include/configs/smdk2410.h include/configs/tq2440.h (2) 增加宏定义: #define CONFIG_DRIVER_DM9000
1 #define CONFIG_DM9000_BASE
0x20000300 #define DM9000_IO
CONFIG_DM9000_BASE #define DM9000_DATA
(CONFIG_DM9000_BASE + 4) #define CONFIG_DM9000_USE_16BIT #define CONFIG_SETUP_MEMORY_TAGS 1 #define CONFIG_CMDLINE_TAG 1 (3)#define CONFIG_COMMANDS \中增加如下三项:
CFG_CMD_PING
| \
CFG_CMD_JFFS2 | \
CFG_CMD_NAND
| \ (4)修改网络相关参数: #define CONFIG_BOOTDELAY 1 #define CONFIG_BOOTARGS
"noinitrd root=/dev/mtdblock2 init=/linuxrc
console=ttySAC0" #define CONFIG_ETHADDR
0a:1b:2c:3d:4e:5f #define CONFIG_NETMASK
255.255.255.0 #define CONFIG_IPADDR
192.168.1.6 #define CONFIG_SERVERIP
192.168.1.8
(5)#define CONFIG_AMD_LV400 1
/* uncomment this if you have a LV400 flash */ #if 0 #define CONFIG_AMD_LV800 1 /*
uncomment this if you have a LV800 flash */ #endif 修改为: #if 0 #define CONFIG_AMD_LV400 1 /*
uncomment this if you have a LV400 flash */ #endif #define CONFIG_AMD_LV800 1 /*
uncomment this if you have a LV800 flash */
(6) 在最后#endif /* __CONFIG_H */前增加NAND相关宏定义: #define CFG_NAND_BASE
0 #define CFG_MAX_NAND_DEVICE 1 #define NAND_MAX_CHIPS 1
三. 修改cpu/arm920t/start.S (1) #elif defined(CONFIG_S3C2410)后添加: # define INTMOD 0X4A000004 (2)将 /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #3 str r1, [r0] 修改为: #if 0 /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #3 str r1, [r0] #endif
(3) 在 bl cpu_init_crit #endif后面加上 /* Set up the stack
*/ stack_setup: ldr r0, _TEXT_BASE
/* upper 128 KiB: relocated
uboot */ sub r0, r0,
#CFG_MALLOC_LEN /* malloc area
*/ sub r0, r0,
#CFG_GBL_DATA_SIZE /* bdinfo
*/
sub sp, r0, #12
/* leave 3 words for
abort-stack */
bl clock_init
(4) 将下列代码替换 #ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate:
/* relocate U-Boot to
RAM */ adr r0, _start
/* r0 <- current position of
code */ ldr r1, _TEXT_BASE
/* test if we run from flash or RAM
*/ cmp r0, r1
/* don't reloc during debug
*/ beq stack_setup
ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2
/* r2 <- size of armboot
*/ add r2, r0, r2
/* r2 <- source end address
*/
copy_loop: ldmia r0!,
{r3-r10} /* copy from source
address [r0] */ stmia r1!,
{r3-r10} /* copy to
target address [r1] */ cmp r0, r2
/* until source end addreee [r2] */ ble copy_loop #endif /* CONFIG_SKIP_RELOCATE_UBOOT */
/* Set up the stack
*/ stack_setup: ldr r0, _TEXT_BASE
/* upper 128 KiB: relocated
uboot */ sub r0, r0,
#CFG_MALLOC_LEN /* malloc area
*/ sub r0, r0,
#CFG_GBL_DATA_SIZE /* bdinfo
*/ #ifdef CONFIG_USE_IRQ sub r0, r0,
#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endif sub sp, r0, #12
/* leave 3 words for
abort-stack */ 替换为: #ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate:
/* relocate U-Boot to
RAM */ adr r0, _start
/* r0 <- current position of
code */ ldr r1, _TEXT_BASE
/* test if we run from flash or RAM
*/ cmp r0, r1
/* don't reloc during debug
*/ beq clear_bss
ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2
/* r2 <- size of armboot
*/ #if 1 bl CopyCode2Ram
/* r0: source, r1: dest, r2: size */ #else add r2, r0, r2
/* r2 <- source end address
*/
copy_loop: ldmia r0!,
{r3-r10} /* copy from source
address [r0] */ stmia r1!,
{r3-r10} /* copy to
target address [r1] */ cmp r0, r2
/* until source end addreee [r2] */ ble copy_loop #endif #endif /* CONFIG_SKIP_RELOCATE_UBOOT */
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
4.相关头文件 (1) include/s3c24x0.h 在下面结构体中添加S3C24X0_REG32 CAMDIVN; typedef struct { S3C24X0_REG32 LOCKTIME; S3C24X0_REG32 MPLLCON; S3C24X0_REG32 UPLLCON; S3C24X0_REG32 CLKCON; S3C24X0_REG32 CLKSLOW; S3C24X0_REG32 CLKDIVN; }
添加NAND寄存器结构体 /* NAND FLASH (see S3C2440 manual chapter 6, www.top-e.org) */ typedef struct { S3C24X0_REG32 NFCONF; S3C24X0_REG32 NFCONT; S3C24X0_REG32 NFCMD; S3C24X0_REG32 NFADDR; S3C24X0_REG32 NFDATA; S3C24X0_REG32 NFMECCD0; S3C24X0_REG32 NFMECCD1; S3C24X0_REG32 NFSECCD; S3C24X0_REG32 NFSTAT; S3C24X0_REG32 NFESTAT0; S3C24X0_REG32 NFESTAT1; S3C24X0_REG32 NFMECC0; S3C24X0_REG32 NFMECC1; S3C24X0_REG32 NFSECC; S3C24X0_REG32 NFSBLK; S3C24X0_REG32 NFEBLK; } /*__attribute__((__packed__))*/ S3C2440_NAND;
(2) cpu/arm920t/s3c24x0/speed.c 【1】在#define MPLL 0 #define UPLL 1上面增加 DECLARE_GLOBAL_DATA_PTR; 【2】在 m = ((r & 0xFF000) >> 12) + 8; p = ((r & 0x003F0) >> 4) + 2; s = r & 0x3;后面 增加 /* support both of S3C2410 and S3C2440 */ if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410) return((CONFIG_SYS_CLK_FREQ * m) / (p << s)); else return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* S3C2440
*/ 【3】增加宏定义 /* for s3c2440 */ #define S3C2440_CLKDIVN_PDIVN (1<<0) #define S3C2440_CLKDIVN_HDIVN_MASK (3<<1) #define S3C2440_CLKDIVN_HDIVN_1 (0<<1) #define S3C2440_CLKDIVN_HDIVN_2 (1<<1) #define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1) #define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1) #define S3C2440_CLKDIVN_UCLK (1<<3)
#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0) #define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4) #define S3C2440_CAMDIVN_HCLK3_HALF (1<<8) #define S3C2440_CAMDIVN_HCLK4_HALF (1<<9) #define S3C2440_CAMDIVN_DVSEN (1<<12) 【4】get_HCLK get_PCLK函数修改 ulong get_HCLK(void) { S3C24X0_CLOCK_POWER * const clk_power =
S3C24X0_GetBase_CLOCK_POWER(); unsigned long clkdiv; unsigned long camdiv; int hdiv = 1;
/* support both of S3C2410 and S3C2440 */ if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410) return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 :
get_FCLK()); else { clkdiv = clk_power->CLKDIVN; camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) { case S3C2440_CLKDIVN_HDIVN_1: hdiv = 1; break;
case S3C2440_CLKDIVN_HDIVN_2: hdiv = 2; break;
case S3C2440_CLKDIVN_HDIVN_4_8: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; break;
case S3C2440_CLKDIVN_HDIVN_3_6: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; break; }
return get_FCLK() / hdiv; } }
/* return PCLK frequency */ ulong get_PCLK(void) { S3C24X0_CLOCK_POWER * const clk_power =
S3C24X0_GetBase_CLOCK_POWER(); unsigned long clkdiv; unsigned long camdiv; int hdiv = 1;
/* support both of S3C2410 and S3C2440 */ if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410) return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 :
get_HCLK()); else { clkdiv = clk_power->CLKDIVN; camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) { case S3C2440_CLKDIVN_HDIVN_1: hdiv = 1; break;
case S3C2440_CLKDIVN_HDIVN_2: hdiv = 2; break;
case S3C2440_CLKDIVN_HDIVN_4_8: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; break;
case S3C2440_CLKDIVN_HDIVN_3_6: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; break; }
return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)?
2:1); } }
(3) common/env_nand.c
// puts ("*** Warning - bad CRC or NAND, using default
environment\n\n"); //HJ_del 注释此句
(4) include/nand.h struct nand_write_options {结构体中添加 int skipfirstblk; /* if true, skip the first good block*/
(5) include/s3c2410.h 添加: /* for s3c2440, www.top-e.org */ static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void) { return (S3C2440_NAND * const)S3C2410_NAND_BASE; }
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:17
帖子:10
精华:0
等级:学徒
注册时间:2009-07-06
最后登录:2009-12-29 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
5.增加函数实现 (1)common/cmd_load.c 【1】增加函数声明 /* support xmodem*/ static ulong load_serial_xmodem (ulong offset); 并后面添加其函数实现: /* support xmodem */ static ulong load_serial_xmodem (ulong offset) { int size; char buf[32]; int err; int res; connection_info_t info; char xmodemBuf[1024]; ulong store_addr = ~0; ulong addr = 0;
size = 0; info.mode = xyzModem_xmodem; res = xyzModem_stream_open (&info, &err); if (!res) {
while ((res = xyzModem_stream_read (xmodemBuf, 1024, &err)) > 0) { store_addr = addr + offset; size += res; addr += res; #ifndef CFG_NO_FLASH if (addr2info (store_addr)) { int rc;
rc = flash_write ((char *) xmodemBuf, store_addr, res); if (rc != 0) { flash_perror (rc); return (~0); } } else #endif { memcpy ((char *) (store_addr), xmodemBuf, res); }
} } else { printf ("%s\n", xyzModem_error (err)); }
xyzModem_stream_close (&err); xyzModem_stream_terminate (false, &getcxmodem);
flush_cache (offset, size);
printf ("## Total Size = 0x%08x = %d Bytes\n", size, size); sprintf (buf, "%X", size); setenv ("filesize", buf);
return offset; }
【2】增加UBOOT命令 /* support xmodem */ U_BOOT_CMD( loadx, 3, 0, do_load_serial_bin, "loadx - load binary file over serial line (xmodem mode)\n", "[ off ] [ baud ]\n" " - load binary file over serial line" " with offset 'off' and baudrate 'baud'\n" );
【3】在 printf ("## Ready for binary (ymodem) download " "to 0x%08lX at %d bps...\n", offset, load_baudrate);前添加 /* support xmodem */ if (strcmp(argv[0],"loadx")==0) { printf ("## Ready for binary (xmodem) download " "to 0x%08lX at %d bps...\n", offset, load_baudrate);
addr = load_serial_xmodem (offset);
} else if (strcmp(argv[0],"loady")==0) {
(2)common/cmd_nand.c 【1】U_BOOT_CMD(nand, 5, 1, do_nand,中, 增加 "nand read.yaffs addr off size - read the `size' byte yaffs image
starting\n" " at offset `off' to memory address `addr'\n" "nand write.yaffs addr off size - write the `size' byte yaffs image
starting\n" " at offset `off' from memory address `addr'\n" 【2】在 } else { /* write */ nand_write_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; /* opts.forcejffs2 = 1; */ opts.pad = 1; opts.blockalign = 1; opts.quiet = quiet; ret = nand_write_opts(nand, &opts); }后面添加 }else if ( s != NULL && !strcmp(s, ".yaffs")){ if (read) { /* read */ nand_read_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; opts.readoob = 1; opts.quiet = quiet; ret = nand_read_opts(nand, &opts); } else { /* write */ nand_write_options_t opts; memset(&opts, 0, sizeof(opts)); opts.buffer = (u_char*) addr; opts.length = size; opts.offset = off; /* opts.forceyaffs = 1; */ opts.noecc = 1; opts.writeoob = 1; opts.blockalign = 1; opts.quiet = quiet; opts.skipfirstblk = 1; ret = nand_write_opts(nand, &opts); }
(3)common/main.c // run_command (s, 0);此句注释,并添加 boot_zImage(0x4c000,0x200000);
(4)drivers/dm9000x.c 【1】修改 for (i = 0; i < 6; i++) ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i); char *tmp =
getenv("ethaddr"); 为: char *end;
for (i = 0; i < 6; i++) // ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i); { bd->bi_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) :
0; if(tmp) tmp = (*end) ? end+1 : end; } 【2】 DM9000_iow(DM9000_IMR, IMR_PAR); /* Enable TX/RX interrupt mask
*/前添加#if 0 return 0;前添加#endif
(5) drivers/nand/nand_base.c 最后return this->scan_bbt (mtd); 修改为 return 0;
(6) drivers/nand/nand_util.c 【1】 u_char *buffer = opts->buffer; size_t written; int result;后面添加 int skipfirstblk = opts->skipfirstblk; 【2】在 readlen = meminfo->oobblock; if (opts->pad && (imglen < readlen)) {前面添加 /* skip the first good block when wirte yaffs image */ if (skipfirstblk) { mtdoffset += erasesize_blockalign; skipfirstblk = 0; continue; }
(7)增加新文件 lib_arm/boot_zImage.c #include <common.h> #include <command.h> #include <def.h> #include <image.h> #include <zlib.h> #include <asm/byteorder.h> #include <s3c2410.h> #include "asm-arm/mach-types.h"
#define LINUX_KERNEL_OFFSET 0x8000 #define LINUX_PARAM_OFFSET 0x100 #define LINUX_PAGE_SIZE 0x00001000 #define LINUX_PAGE_SHIFT 12 #define LINUX_ZIMAGE_MAGIC 0x016f2818 #define DRAM_SIZE 0x04000000
extern int nand_read_ll_lcd(unsigned char*, unsigned long, int);
/* * Disable IRQs */ #define local_irq_disable() \ ({ \ unsigned long temp; \ __asm__ __volatile__( \ "mrs %0, cpsr @ local_irq_disable\n" \ " orr %0, %0, #128\n" \ " msr cpsr_c, %0" \ : "=r" (temp) \ : \ : "memory", "cc"); \ })
static inline void cpu_arm920_cache_clean_invalidate_all(void) { __asm__( " mov r1, #0\n" " mov r1, #7 << 5\n" /* 8 segments */ "1: orr r3, r1, #63 << 26\n" /* 64 entries */ "2: mcr p15, 0, r3, c7, c14, 2\n" /* clean & invalidate D index
*/ " subs r3, r3, #1 << 26\n" " bcs 2b\n" /* entries 64 to 0 */ " subs r1, r1, #1 << 5\n" " bcs 1b\n" /* segments 7 to 0 */ " mcr p15, 0, r1, c7, c5, 0\n" /* invalidate I cache */ " mcr p15, 0, r1, c7, c10, 4\n" /* drain WB */ ); }
void cache_clean_invalidate(void) { cpu_arm920_cache_clean_invalidate_all(); }
static inline void cpu_arm920_tlb_invalidate_all(void) { __asm__( "mov r0, #0\n" "mcr p15, 0, r0, c7, c10, 4\n" /* drain WB */ "mcr p15, 0, r0, c8, c7, 0\n" /* invalidate I & D TLBs */ ); }
void tlb_invalidate(void) { cpu_arm920_tlb_invalidate_all(); }
void call_linux(long a0, long a1, long a2) { local_irq_disable(); cache_clean_invalidate(); tlb_invalidate();
__asm__( "mov r0, %0\n" "mov r1, %1\n" "mov r2, %2\n" "mov ip, #0\n" "mcr p15, 0, ip, c13, c0, 0\n" /* zero PID */ "mcr p15, 0, ip, c7, c7, 0\n" /* invalidate I,D caches */ "mcr p15, 0, ip, c7, c10, 4\n" /* drain write buffer */ "mcr p15, 0, ip, c8, c7, 0\n" /* invalidate I,D TLBs */ "mrc p15, 0, ip, c1, c0, 0\n" /* get control register */ "bic ip, ip, #0x0001\n" /* disable MMU */ "mcr p15, 0, ip, c1, c0, 0\n" /* write control register */ "mov pc, r2\n" "nop\n" "nop\n" : /* no outpus */ : "r" (a0), "r" (a1), "r" (a2) : "r0","r1","r2","ip" ); }
/* * pram_base: base address of linux paramter */ static void setup_linux_param(ulong param_base) { struct param_struct *params = (struct param_struct *)param_base; char *linux_cmd;
// printk("Setup linux parameters at 0x%08lx\n", param_base); memset(params, 0, sizeof(struct param_struct));
params->u1.s.page_size = LINUX_PAGE_SIZE; params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT);
/* set linux command line */ linux_cmd = getenv ("bootargs"); if (linux_cmd == NULL) { printk("Wrong magic: could not found linux command line\n"); } else { memcpy(params->commandline, linux_cmd, strlen(linux_cmd) + 1); // printk("linux command line is: \"%s\"\n", linux_cmd); } }
/* * dst: destination address * src: source * size: size to copy * mt: type of storage device */ static inline int copy_kernel_img(ulong dst, const char *src,
size_t size) { int ret = 0; ret = nand_read_ll((unsigned char *)dst, (unsigned long)src, (int)size); return ret; }
int boot_zImage(ulong from, size_t size) { int ret; ulong boot_mem_base; /* base address of bootable memory 鍢庡敱? */ ulong to; ulong mach_type;
boot_mem_base = 0x30000000;
/* copy kerne image */ to = boot_mem_base + LINUX_KERNEL_OFFSET; printk("Copy linux kernel from 0x%08lx to 0x%08lx, size = 0x%08lx
... ", from, to, size); ret = copy_kernel_img(to, (char *)from, size); if (ret) { printk("failed\n"); return -1; } else { printk("Copy Kernel to SDRAM done,"); }
if (*(ulong *)(to + 9*4) != LINUX_ZIMAGE_MAGIC) { printk("Warning: this binary is not compressed linux kernel
image\n"); printk("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4)); } else { // printk("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4)); ; }
/* Setup linux parameters and linux command line */ setup_linux_param(boot_mem_base + LINUX_PARAM_OFFSET);
/* Get machine type */ mach_type = MACH_TYPE_S3C2440; // printk("MACH_TYPE = %d\n", mach_type);
/* Go Go Go */ printk("NOW, Booting Linux......\n"); call_linux(0, mach_type, to);
return 0; }
int do_boot_zImage (cmd_tbl_t *cmdtp, int flag, int argc, char
*argv[]) { boot_zImage(0x4c000,0x200000); return 0; }
U_BOOT_CMD( boot_zImage, 3, 0, do_boot_zImage, "boot_zImage - boot Linux 's zImage\n", " - boot Linux 's zImage" );
int boot_noos(ulong from, size_t size) { int ret; ulong boot_mem_base; /* base address of bootable memory 鍢庡敱? */ ulong to;
boot_mem_base = 0x30000000;
/* copy kerne image */ to = boot_mem_base; printk("Copy code from 0x%08lx to 0x%08lx, size = 0x%08lx ... ", from, to, size); ret = copy_kernel_img(to, (char *)from, size); if (ret) { printk("failed\n"); return -1; } else { printk("Copy code to SDRAM done,"); }
/* Go Go Go */ printk("NOW, Booting code......\n"); run_command("go 0x30000000", 0);
return 0; } int do_boot_noos (cmd_tbl_t *cmdtp, int flag, int argc, char
*argv[]) { boot_noos(0x4c000,0x200000); return 0; }
U_BOOT_CMD( boot_noos, 3, 0, do_boot_noos, "boot_noos - boot SKY2440_test\n", " - boot SKY2440_test" );
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
头衔:版主
积分:1366
帖子:88
精华:0
等级:高级工程师
注册时间:2009-02-24
最后登录:2009-12-14 |
|
|
|
|
| 回复:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
四.u-boot烧写:1.硬件连接 把JTAG下载板接到并口,把JTAG下载板上和开发板上的JTAG口用JTAG线相连。 2.烧写过程 首先运行SJF2440.exe。点击“开始”中的“运行”,如下图所示:
 在弹出的菜单中输入“cmd”点击确定,如下图所示:  在弹出的界面中用DOS命令进入SJF2440所在文件夹打开开发板电源运行SJF2440,过程如下图所示:  选择“0”回车,“0”回车,“0”回车。如下图所示:  烧写成功后按“2”退出,可以连接串口线用DNW查看串口信息设置使用的串口COM和波特率115200 后可以看到u-boot界面如图:  看到界面已经很接近成功了,要检验u-boot是否彻底成功可以将内核烧写到开发板上看看是否可以运行,这将是第三阶段中的内容——内核移植过程。
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:10
帖子:66
精华:0
等级:学徒
注册时间:2009-11-05
最后登录:2009-11-06 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
|
|
|
| |
|
|
|
...
|
|
|
|
|
|
|
积分:43
帖子:25
精华:0
等级:学徒
注册时间:2009-11-01
最后登录:2009-11-07 |
|
|
|
|
| RE:【社区大讲堂】顶嵌与你一起:动手做嵌入式产品 |
| |
|
|
|
| |
|
|
|
...
|
|
|