星期二, 一月 22, 2008

扎扎实实作技术

今天突然想起以前老师的话

扎扎实实做学问,努力学技术
实事求是

这些朴素的字眼自己现在才明白其中的深意
感谢老师,感谢学校的培养,
感谢父母
感谢yn

Read More...

Linux configure 参数解释

Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。
与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。
为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考
'configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'--help'选项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍:
--cache-file=FILE
'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.
--help
输出帮助信息.即使是有经验的用户也偶尔需要使用使用'--help'选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的'configure'脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.
--no-create
'configure'中的一个主要函数会制作输出文件.此选项阻止'configure'生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.
--quiet
--silent
当'configure'进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为'configure'可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)
--version
打印用来产生'configure'脚本的Autoconf的版本号.
--prefix=PEWFIX
'--prefix'是最常用的选项.制作出的'Makefile'会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":
$ ./configure --prefix=/opt/gnu
--exec-prefix=EPREFIX
与'--prefix'选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的'emacs'二进制文件就是这样一个问件.如果没有设置这个选项的话,默认使用的选项值将被设为和'--prefix'选项值一样.
--bindir=DIR
指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.
--sbindir=DIR
指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.
--libexecdir=DIR
指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.
--datadir=DIR
指定通用数据文件的安装位置.
--sysconfdir=DIR
指定在单个机器上使用的只读数据的安装位置.
--sharedstatedir=DIR
指定可以在多个机器上共享的可写数据的安装位置.
--localstatedir=DIR
指定只能单机使用的可写数据的安装位置.
--libdir=DIR
指定库文件的安装位置.
--includedir=DIR
指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.
--oldincludedir=DIR
指定为除GCC外编译器安装的C头文件的安装位置.
--infodir=DIR
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.
--mandir=DIR
指定手册页的安装位置.
--srcdir=DIR
这个选项对安装没有作用.他会告诉'configure'源码的位置.一般来说不用指定此选项,因为'configure'脚本一般和源码文件在同一个目录下.
--program-prefix=PREFIX
指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=g'来configure一个名为'tar'的程序将会使安装的程序被命名为'gtar'.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in'文件使用时才会工作.
--program-suffix=SUFFIX
指定将被加到所安装程序的名字上的后缀.
--program-transform-name=PROGRAM
这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM'来产生安装的名字.
--build=BUILD
指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.
--host=HOST
指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.
--target=GARGET
指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值.
--disable-FEATURE
一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些特性,可以使用'--disable-FEATURE'来禁用它,这里'FEATURE'是特性的名字.例如:
$ ./configure --disable-gui
-enable-FEATURE[=ARG]
相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名字.一个特性可能会接受一个可选的参数.例如:
$ ./configure --enable-buffers=128
`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的.
--with-PACKAGE[=ARG]
在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如,倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
'--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的.
--without-PACKAGE
有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:
$ ./configure --without-gnu-ld
--x-includes=DIR
这个选项是'--with-PACKAGE'选项的一个特例.在Autoconf最初被开发出来时,流行使用'configure'来作为Imake的一个变通方法来制作运行于X的软件.'--x-includes'选项提供了向'configure'脚本指明包含X11头文件的目录的方法.
--x-libraries=DIR
类似的,'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法.
在源码树中运行'configure'是不必要的同时也是不好的.一个由'configure'产生的良好的'Makefile'可以构筑源码属于另一棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树.这也使在另一个不同的系统或用不同的配置选项构筑同样的目标文件非常困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:
$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ ../mmalloc-1.0/configure
creating cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for a BSD compatible install... /usr/bin/install -c
checking host system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for ar... ar
checking for ranlib... ranlib
checking how to run the C preprocessor... gcc -E
checking for unistd.h... yes
checking for getpagesize... yes
checking for working mmap... yes
checking for limits.h... yes
checking for stddef.h... yes
updating cache ../config.cache
creating ./config.status
这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置'/usr/local':
$ make all && make install

Read More...

星期一, 一月 21, 2008

UDEV on embeded Linux-2.6.19.2 UDEV on embeded Linux-2.6.19.2[转]

UDEV,新一代的用户空间设备管理系统,用以取代臃肿的DEVFS(其实DEVFS我还没用过,谁叫我是新来的 ^_^ ,关于两者的对比,可以参考 udev_vs_devfs )。关于UDEV的使用已经有一遍不错的译文 udev轻松上路 ,不过里面关于配置文件的编写与 Writing udev rules 不符。/etc/udev/udev.conf 是udev启动检查的配置文件,包括路径,权限,规则目录等,具体的规则文件应该为/etc/udev/rules.d/10-local.rules 。

我开始移植的第一个Linux是2.6.19.2,已放弃对DEVFS的支持,下面谈谈UDEV在我的arm开发板上的应用。由于BusyBox已带有一个简化板的udev--mdev。通过简单的 mdev -s ,就能自动装配/dev目录下的设备文件:

# ls /dev
console null ptmx pts shm
# mdev -s && ls /dev
apm_bios ptypd tty24 tty56
console ptype tty25 tty57
fb0 ptypf tty26 tty58
full ram0 tty27 tty59
kmem ram1 tty28 tty6
kmsg ram2 tty29 tty60
loop0 ram3 tty3 tty61
... ...
启动热拔插支持的话,用这一句
echo /sbin/mdev > /proc/sys/kernel/hotplug
一切就是这么简单,相应的/dev目录下会出现一大堆设备文件,甚是难看 ^_^
mdev的规则文件是/etc/mdev.conf ,与传统的udev规则文件写法上有点区别(简化了^_^)。
KERNEL=="tty[0-9]*", NAME="vc/%n" //for udev
tty[0-9]* 0:5 660 //for mdev
如果选上FEATURE_MDEV_EXEC支持,规则后面可以执行相应的命令,如:
pts/ 0:0 755 $mount -t devpts /dev/pts /dev/pts
不过我的程序还算简单,mdev -s 对我而言已足够,规则,留作日后写吧 ^_^
我用的是mdev,因为简单 ^_^
在启动教本(如:linuxrc)加入这两句就搞定:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

Read More...

busybox mdev的初始化问题


mdev来自动创建/dev中的设备文件,busybox的文档中说的很明白,使用
mdev时不加参数就是用hotplug机制来决定创建什么样的设备文件。

而用mdev -s是用sys文件系统提供的信息来创建设备文件的。我一开始没仔细看文档,在linuxrc中没加参数调用的mdev,结果造成真正的根文件系统没有挂载成功。因为那样mdev就要找hotplug而
buzybox好像还不能支持hotplug,我自己也没提供hotplug的机制,所以设备文件创建失
败,那么在mount 根文件系统的时候就失败了,后面再pivot_root也就没戏了。
最后一点要注意的是在你的initrd的/dev中必须要有console这个文件,要不启动的时候
就会报错的。
我把linuxrc贴在这,顺便加点注释:
#!/bin/ash
echo Start the script in initrd #输出一些信息
echo Press any key to continue #输出信息
read TEMP #等待你瞪大眼睛看后面的东西
/bin/mount -t proc /proc /proc #挂proc fs,其实我们这暂时还没用到,如果你要动
#态分析根文件系统,你就得分析kernel的cmdline,那个cmdline就在proc中
/bin/mount -t sysfs none /sys #挂sys为mdev填充/dev搜集信息
echo Creating /dev
/bin/mount -o mode=0755 -t tmpfs none /dev #在原有的/dev目录上再盖上一层,这
#样系统退出时就不会留下mdev填充的东西
#下面创建一些最基本设备文件,这些设备文件是mdev所使用的
/bin/mknod /dev/console c 5 1
/bin/mknod /dev/null c 1 3
/bin/mknod /dev/zero c 1 5
/bin/mkdir /dev/pts
/bin/mkdir /dev/shm
/sbin/mdev -s #mdev为我们自动填充/dev目录,该有的都会有的
#下面加载ext3所需的模块
echo "Loading ext3 modules"
/sbin/insmod /lib/jbd.ko
/sbin/insmod /lib/ext3.ko
/sbin/mdev -s #再次调用mdev,我不知道为什么,rh的initrd中就是调用两次,也许
#去掉前面的一次也没问题,回头我试试
/bin/umount /sys #卸掉sys,反正用完了
echo press any key to continue
read TEMP #等待你瞪大眼睛
echo Mounting root filesystem
/bin/mount -o defaults --ro -t ext2 /dev/hda1 /sysroot #挂载真正的根文件系统
,老道的技术应该是从kernel的cmdling中猜出根文件设备,而不是象我这样hard coded
/bin/mount -t tmpfs --bind /dev /sysroot/dev #保持新旧root 中的/dev是一样的
#下面的root切换都是标准动作在pivot_root的man page中有
echo Switching to new root
read TEMP
cd /sysroot
/sbin/pivot_root . mnt
exec /usr/sbin/chroot . /sbin/init
/bin/umount /mnt/dev #卸掉原来root 的dev目录

Read More...

移植2.6.22.1到2410上


今天在板子上移植了2.6.22内核,用uboot能正常引导进入cramfs文件系统,但是cs8900a网卡还不能正常工作,明天继续加油,得好好研究研究这块了。


主要是参考http://hi.baidu.com/wangy0919/blog/


这个blog收集的文章很全,呵呵,虽然不是原创,但是也难能可贵的,我也受益匪浅,谢谢blog主人了。


基本没出什么大问题,就是在制作根文件系统的时候,有点小问题,还有就是uboot的bootargs参数设置


Read More...

星期四, 一月 17, 2008

晚来的新年联欢会

入职半年了,迎来了工作生涯的第一个联合会,今晚和老陈,pan,fan练习了一晚上的歌,虽然自己五音不全,不过每个人都有节目,所以自己也得准备个,再说了能和老陈一起唱歌心里也挺开心的,老陈人不错,对下属随和,有亲切感,自己还是很爱和他一起做些什么的。
希望明天能有出色的发挥。
有几天没写blog的,这段有点忙,今天移植成功uboot心里还是很高兴的,这是自己偷偷的移植的,主管要是知道了又得说干和工作无关的事了,什么是和工作有关的?我一直不明白
他说什么有关就是什么有关?不学习,到用的时候从天上来?谁都得学习啊!算了自己就是一个打工的,随便吧,不行了我考研行了吧。真是的!
只许州官放火,不许百姓点灯,说起来还一套一套的,自己是怎么做的?
哎,社会啊
算了,走自己的路,别人去说吧。
。。。。。。。。。。。。。。。。。。
志存高远!
希望能学到更多的知识,也顺便感谢下yani,最近有些对不住她,对她的照顾少了些,相信我吧
会给你个明媚灿烂的明天的!
fighting!

Read More...

使U-BOOT正确引导linux内核

1、为了能使得U-BOOT正确引导linux内核。必须传递合适的参数给内核。
修改include/configs/zj2410.h如下:
/************************************************************
* RTC
************************************************************/
#define CONFIG_RTC_S 24X0 1
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
#define CONFIG_BAUDRATE 115200
/************************************************************/
/* My Add */
/* enable passing of ATAGs */#define CONFIG_CMDLINE_TAG 1
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG 1
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
2、为了能稳定正确引导linux内核,得修改UBOOT的2410CPU频率。
smdk2410的U-BOOT原来运行频率是 ,在这个频率我已开始能正确引导内核,但是后来突然就不能引导了,
总是死在下面这个地方:
Uncompressing Linux....................................................... done, booting the kernel.
按照网上的说法,内核中,在\arch\arm\mach_s 2410\s 2410.c 中
fclk = s 2410_get_pll(MPLLCON, xtal); //读出来的fclk结果和bootloader的频率不一致。
既然不能用 ,VIVI的 能跑得好好的,那我把U-BOOT的频率改成 , 2.6.20 .3的内核和阳初光盘的2.4.18的内核都能正确稳定地引导了。
修改board/yangchu2410/smdk2410.c文件如下:
#define FCLK_SPEED 1
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif
好了,编译烧写U-BOOT到NAND FLASH,通过setenv 设置bootargs,引导内核时就可以将bootargs传递给内核了。
注意:
1、 对于U-BOOT而言,启动内核时候使用bootm命令才能传递内核参数,使用go命令是不传递内核参数的。
2、 bootm命令引导的只能是用U-BOOT的mkimage工具做过的内核映像,所以要引导阳初光盘带的内核映像,必须用其工具转换一下,至于这个工具怎么用,到U-BOOT的tools目录下找这个工具去吧,./mkimage --help 或者网上找找资料看下就知道了。^_^。

Read More...

移植uboot到2410上总结

这两天有点空闲时间,自己忙里偷闲,偷偷的在实验室的板子上移植了uboot
板子是我们自己制版焊接的,所以稳定性不是很好,不过凑合也能正常工作,一直以来工作都是用vivi,但是这个版本的vivi没有tftp下载功能,所以用xmodem协议下载zImage的时候太漫长了,而自己想移植个带tftp功能的vivi,可是由于没那么多时间就一直没成功,一直uboot也是试试,如果折腾折腾没成功,估计最后也得放弃,毕竟现在没那么多时间,而且主管也没给那个时间,这一切都是凭着工作之余,自己的兴趣所在。
板子是参考广州斯道2410的公版,还有友善之臂,反正内核什么的都没改直接就用他们的这些能正常在我们的板子上跑,我想硬件都一样吧,要不然也不能正常的跑,而且都是smdk2410公版的修改,(硬件是另一个同事做的,我具体不是很懂,不过应该和我想想的一样)
uboot是1.1.4的主要参考了
要参考了luofuchong 大侠
http://www.hhcn.com/cgi-bin/topic.cgi?forum=3&topic=562&start=0&show=
和bekars大侠
http://dev.csdn.net/article/84/84538.shtm
代码就是直接下载的xiaoluo的代码,然后打上他的补丁就ok了
make distclean
make clean
make smdk2410_config
make
就可以生成u-boot.bin了
用sjf2410烧写可以看到能够在板子上启动
一切都比较顺利(我想这都是因为xiaoluo都已经改过了)
但是还是有些问题,那就是不能正常引导内核
到Uncompressing Linux....................................................... done, booting the kernel的时候就停住了
这时候自己连uboot的基本命令都还不懂,又上网查了查用法
继续试验,还是不行,后来参考了另一个帖子,说是因为内核参数没有正确传递的原因,内核应该启动起来了,可是就是没有输出信息,和我在调试其他驱动的时候把console设为tty0一样,于是就朝着这个方向去解决问题
修改board目录下smdk2410.c
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0

#endif
在include/configs/smdk2410.h中加上

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1

然后重新编译uboot

重新下载后,问题还是一样,很是郁闷,就有上网抠,查到还有人说是频率不对,我下面转的

几个帖子就是。
smdk2410的U-BOOT原来运行频率是202.8M,把U-BOOT的频率改成200M,

"board/smdk2410/smdk2410.c"

#define FCLK_SPEED 1

#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif

重新少些后问题依然,郁闷ing
后来又反复试验,在快要放弃的时候,突然发现有一次能引导kernel了
发现在这个uboot中有个bootargs参数要正确设置,由于受vivi影响,一直都是这么设置的
setenv bootargs="noinitrd console=ttyS0 root=/dev/mtdblock/4"
然后就saveenv了
以为没有问题,所以反复试验都没查这个,但是后来仔细printenv一看
bootargs="noinitrd=console=ttyS0 root=/dev/mtdblock/4"
不知道为什么多了个“=”
又反复设置,就是不能像vivi那样,不明白了,是不是这个uboot的bug还是uboot就是这样,没用过uboot不知道了
后来看设置bootcmd的时候是这样的:
setenv bootcmd=nand read 0x30000 0x1d0000
没有引号,不是自己想象的那样用引号括起来。
于是重新设置bootargs
setenv bootargs=noinitrd console=ttyS0 root=/dev/mtdblock/4
saveenv
这下终于可以boot kernel了
查点到这里就放弃了,回想起来,细心和坚持很重要,要不是坚持,可能这个问题就这么放过去了。
坚持!!!!!!!!!
再一次鼓励了我,虽然这次没什么太多的技术含量(个人感觉没有什么技术含量,就是google,还有就是直觉)
后来重新试验,发现上面修改的频率是有作用的,如果

#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
改为
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x2
就出现了乱码,可能是波特率也随着改变了,所以有输出但是乱码,
但是

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1

这个还没有机会试验呢,但是我想也应该有作用的
不然kernel的参数就传递不过来了

Read More...

星期三, 一月 16, 2008

U-BOOT移植到阳初2410的板子【转】

这个好东西是从阳初论坛上下载的。我自己还没有研究,希望有兴趣的朋友可以研究一下。附件上有源代码,还有专门的word文档说明。以后研究了再放上更多的详细介绍,先发给大家玩玩!最近忙考试和制作简历,没时间!!呵呵!!!!!

以下是作者在论坛的讨论的内容:

晕死,发了半天,居然都没发上来,说我字数限制,我都没几个字。

只能传了。

写的匆忙,还没来得及改,有错的地方,望各位指出。^_^

我的工作环境:

RedHat 9

arm-linux-gcc 4.1.1(glibc2.3.2)

U-BOOT1.2.0

目标板:阳初S3C2410开发板V2.3版

买回来,板子上没有NOR FLASH,给的也只有VIVI,我想用U-BOOT(这个用的比较广),所以只能修改U-BOOT从NAND FLASH启动了。

我的内容包括:

NAND FLASH启动;

NAND FLASH驱动,让U-BOOT可以对NAND FLASH读写;

环境变量保存到NAND FLASH。

引导linux内核

参照的主要是网上的文章,我只不过相当于拼凑了一下。呵呵。

我晕,大小上传也只有100KB。只能压缩传了。

顺便把U-BOOT中修改后的几个文件也发上来:

点击浏览该文件

编译后的U-BOOT.bin,可以利用JTAG烧写到NAND FLASH运行的:

点击浏览该文件

晕,之前做的U-BOOT不能正确阳初光盘编译好的linux映像内核。

下载到板子上0x30008000运行,不行,用bootm和go命令的结果都是和前面的结果一样,最后死在这里:

……

……

Uncompressing Linux....................................................... done, booting the kernel.

往下就没了。网上查了很多文章,说法不一,各人的遇到的特殊情况不同吧。

于是,我用2.6.20.3源码make s3c2410_defconfig默认配置,编译了一下,在板子上跑了一下,结果跑起来了,但是查看启动信息,发现U-BOOT的bootargs并没传递给内核:

U-BOOT的bootargs如下:

bootargs=root=/dev/ram rw initrd="0x308000",6000000 console="ttyS0",115200 mem="64M"

而内核启动显示如下:

Kernel command line: root="/dev/hda1" ro init="/bin/bash" console="ttySAC0"

说明U-BOOT并没有设置bootargs到参数里去。
再查看U-BOOT的include/configs/yangchu2410.h文件,发现没有定义如下:

#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */

#define CONFIG_SETUP_MEMORY_TAGS 1

#define CONFIG_INITRD_TAG 1

而#define CONFIG_CMDLINE_TAG 1是在传递cmdline时候必须设置的,所以在include/configs/yangchu2410.h文件中添加如上定义。

定义之后,重新编译U-BOOT,烧写到NAND FLASH中,启动板子。

再跑上面编译的2.6.20.3linux,内核启动信息中显示的参数信息和U-BOOT中设置的一致了。

设置U-BOOT的bootargs:noinitrd root="/dev/mtdblock/2" console="ttyS0" mac="00:01:5d:68:7a:0f",再跑阳初光盘带的linxu内核,往下看到兴奋的字眼了:

YANGCHU2410 # bootm 30008000

## Booting image at 30008000 ...

Image Name: yangchu_linux2.4.18

Created: 2007-08-26 8:06:16 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 772272 Bytes = 754.2 kB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

Starting kernel ...

Uncompressing Linux....................................................... done, booting the kernel.

Linux version 2.4.18-rmk7-pxa1 (fc@localhost.localdomain) (gcc version 2.95.3 20010315 (release)) #441 7 10 11:29:04 CST 2007

CPU: ARM/CIRRUS Arm920Tsid(wb) revision 0

Machine: Samsung-SMDK2410

On node 0 totalpages: 16384

zone(0): 16384 pages.

zone(1): 0 pages.

zone(2): 0 pages.

Kernel command line: noinitrd root="/dev/mtdblock/2" console="ttyS0" mac="00:01:5d:68:7a:0f"
……
……

楼顶的文章我已经改过了,上传了我更新过的文章。

相应要要修改的U-BOOT以及编译好的uboot.bin也重新上传了

UBOOT引导内核真是搞怪,前几天还能引导的,这几天又不能引导了,但是这些内核用VIVI都是能引导的,搞得头痛死了,总是死在下面这个地方:
Uncompressing Linux....................................................... done, booting the kernel.

后来发现是频率的问题。因为网上有人也遇到此问题,相关说法如下:

之后用仿真器追踪内核结果发现:

start_kernel函数的time_init()中程序进入死循环~~

我随之进入time_init()

继续进入 system_timer->init();

结果发现,我的fclk,pclk都不能得到正确的值,积存器正确,我拿笔都能算出来,可是他就是总出错,所以我一气之下把他们全部写死.

具体如下:
在\arch\arm\mach_s3c2410\s3c2410.c 中 搜索 fclk ;

fclk = s3c2410_get_pll(MPLLCON, xtal); //这是他原来的,结果不是我们想要的200MHZ
fclk =200*1000*1000 ; // 这是我加的
在\arch\arm\mach_s3c2410\time.c 中搜索 pclk:

pclk = clk_get_rate(clk); //这是原来的

pclk = 50*1000*1000; //这是我加的

当然这都是根据2410的DATASHEET而定的

我现在用的是FCLK : HCLK : PCLK = 1 : 2 : 4 ,所以我分别写死为200M 100M 50M.

看来我的问题差不多也出在这边了,fclk得不到正确的值,由于没有仿真器,只能这么推测了。因为我终端上显示出来的传递参数都没有问题。

我再看了看VIVI,它里面用的就是200M。

smdk2410的U-BOOT原来运行频率是202.8M,后来把U-BOOT的频率改成200M,2.6.20.3的内核和阳初光盘的2.4.18的内核都能稳定地引导了。

修改文件如下:

"board/yangchu2410/smdk2410.c"

#define FCLK_SPEED 1

#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
//#define M_MDIV 0xA1
//#define M_PDIV 0x3
//#define M_SDIV 0x1
#define M_MDIV 0x5c /* Fout = 200MHz */
#define M_PDIV 0x4
#define M_SDIV 0x0
#endif

Read More...

星期五, 一月 04, 2008

日积月累


学习了如何区别bigendian和littlendian,并编写了一个小程序,来区别本机是big还是little



Read More...