【技术分享】arm-linux一移植必杀技
0赞去年终结了ARM-wince 移植的必杀技,几个简单的要点,现在总结了linux 的关键要点如下,希望大家抛砖。把自己以前移植的wince 和linux 移植的一些简单要点都罗列了,希望大家提出更好的意见,或者指出我笔记的错误。
1.uboot传递给linux内核的nfs启动命令行:
setenv bootargs mem=64M console=ttyS0,57600 root=/dev/nfs rw nfsroot=192.168.1.6:/home/linucos/
newmsg/nfsroot nfsaddrs=192.168.1.8:192.168.1.6:192.168.1.1:255.255.255.0
备注:自己ip:服务ip:网关:掩码
2.uboot传递给linux内核的nandflash上文件系统的命令行:
setenv bootargs console=ttyS0,57600 root=/dev/mtdblock0 init=/linuxrc rootfstype=jffs2
备注:(此处0对应第一个分区,类推1对应第二个分区,分区见内核arch相关目录)
3. uboot传递给linux内核内存ramdisk文件系统的命令行:
setenv bootargs console=ttyS0,57600 root=/dev/ram0 rw initrd=0x21100000,15360000 init=/linuxrc
备注:initrd=指示文件系统在内存中的位置,压缩前大小;同时,内核要进行相应的配置
4. busybox下tftp命令使用:
tftp -r tmp -g 192.168.1.6
得到服务器192.168.1.6上的tmp文件,-g表示get,-r表示remote,192.168.1.6表示服务器ip
同理,
tftp –l tmp –p 192.168.1.6
保存本地tmp到192.168.1.6上,-p表示put,-l表示local,192.168.1.6依然是服务器ip
5. 查看linux分区
cat /proc/partitions
可以看见分区的设备名,主次设备号等很实用的
6.同步串口和LCD显示
只要在原来的bootargs上加:console=tty0即可,如:
setenv bootargs console=ttyS0,57600 console=tty0 root=/dev/mtdblock0 init=/linuxrc rootfstype=jffs2
7.linux出现不能登录的情况,即使用户名root正确
(使用denx官方的文件系统,比较全面,很好)
可能是因为etc目录下配置文件被chmod以为改变权限,解决办法是:直接copy新的etc目录即可,同时注意保留修改过的profile等配置文件
8.普通linux C程序简单休眠
包含 #include <unistd.h>
sleep(5);即可
9.修改root环境变量
root登录后,(ubuntu命令是sudo su)
编辑~/.bashrc文件,新增变量直接写变量如:
JAVA_HOME=/home/.../java所在文件夹
编辑已有变量如:
JAVA_HOME=$JAVA_HOME:/home/.../java所在文件夹
10.终端下快速进入埋藏很深的工作目录的方法
有时候工作目录会很深,简便的办法是:~/.bashrc下增加环境变量即可,如:
工作目录 /home/..../works
增加环境变量WK=/home/..../works
export WK
每次使用只有cd $WK即可
11.ubuntu图形界面用root权限操作
很多时候ubuntu下,只能在终端下root登录操作文件,现在不用了,用下面的方法:
sudo gnome-open 文件夹名称,如:
sudo gonme-open / 用root权限打开根目录了
12.SecureCRT终端回滚行数
有时候,终端结果回滚的行数会很多,有些错误被后边的行覆盖掉
设置 会话选项-回滚缓冲区 值就可以了,比如5000
13.linux 开机logo制作方法
从最初的png图片,制作到最后的ppm图片
# pnmquant 224 img.pnm > img1.pnm
# pnmtoplainpnm img1.pnm > logo_linux_clut224.ppm
file2 是 file1 的soft link
file3 是 file1 的hard link
file1 的 inode 是100, 那么
file3 的 inode 一定是 100, file2的肯定不是100.
即使你删除了 file2 和 file3, 但是file1 仍然存在.
假如你删除了 file1, 那么 file2 一定抱错, 因为它的"父母"没了.
但file3仍然一切正常. 就好象 copy f1 f3 了一样, 并且保持同样的 inode
QTDIR=/usr/local/ARM/qtopia
QPEDIR=/usr/local/ARM/qtopia
QWS_MOUSE_PROTO=USB:/dev/mouse0
export PATH PS1 LD_LIBRARY_PATH QPEDIR QTDIR QWS_MOUSE_PROTO
日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):
#define KERN_EMERG 0/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define KERN_ALERT 1/*报告消息,表示必须立即采取措施*/
#define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR 3/*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/
#define KERN_WARNING 4/*警告条件,对可能出现问题的情况进行警告*/
#define KERN_NOTICE 5/*正常但又重要的条件,用于提醒*/
#define KERN_INFO 6/*提示信息,如驱动程序启动时,打印硬件信息*/
#define KERN_DEBUG 7/*调试级别的消息*/
所以,0处在在高级别上,输出时候,使用printk(KERN_EMERG "msg");即可
将static void fb_flashcursor(void *private)制成空函数如下
同样的方法将函数static void fbcon_cursor(struct vc_data *vc, int mode)用空函数替换
24.ubuntu停止和开启图形界面服务
/etc/init.d/gdm stop就可以停止图形服务
/etc/init.d/gdm start开启图形服务
25.改变uboot和linux内核内容输出串口
uboot中简单的修改,include/configs/<board_name>.h配置文件即可,我的修改:
#define CONFIG_ATMEL_USART 1
#define CONFIG_USART0 1
#undef CONFIG_USART1
#undef CONFIG_USART2
#undef CONFIG_USART3 1 /* USART 3 is DBGU */ 原来是dbug口,undef后不使用了
linux中,一般在io_map下,两个内容需要做:
第一是添加相应串口设备,第二是注册相应串口为串口控制台,我的修改如下:
/* DBGU on ttyS0. (Rx & Tx only) */
at91_register_uart(0, 0, 0); //原来的
/* USART0 on ttyS1. (Rx & Tx only) */
at91_register_uart(AT91RM9200_ID_US0, 1, 0); //新加的
/* set serial console to ttyS0 (ie, DBGU) */
at91_set_serial_console(0); //原来的
/* set serial console to ttyS0 (ie, uart0) */
at91_set_serial_console(1); //新加的
内核配置中,稍有修改,调整早期输出到相应串口选项即可,此选项一般在相应的板子类型下,我的修改成uart0
同时,uboot给linux传递参数注意添加console=ttyS1等
26.tar 命令小结
tar -xvf foo.tar
verbosely extract foo.tar
tar -xzf foo.tar.gz
extract gzipped foo.tar.gz
tar -cjf foo.tar.bz2 bar/
create bzipped tar archive of the directory bar called
foo.tar.bz2
tar -xjf foo.tar.bz2 -C bar/
extract bzipped foo.tar.bz2 after changing directory to bar
tar -xzf foo.tar.gz blah.txt
extract the file blah.txt from foo.tar.gz
27.cp 命令小结
cp source target
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
28.jffs2文件系统制作
mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x4000 -n
更多选项直接 mkfs.jffs2 help
29.给开发板增加域名解析
自己做了根文件系统之后,发现ping www.baidu.com不行,因为没有设置域名解析服务器,解决办法也很简单:
touch /etc/resolv.conf
那么怎么获取dns 地址呢?也和简单的,因为开发板一般和主机用一个路由,所以呢,看看本机/etc/resolv.conf下面的地址就好了,如样添加即可,我的是:
nameserver 202.101.172.35
nameserver 202.101.172.47
30.qtopia-2.2.0编译x86版本
进入源码根目录后,简单的:
./configure -qpe '-prefix=/usr/local/ARM/qtopia_x86'
make
make install
-qpe 是指 qtopia的配置参数,同时-qte 是指qt-embbed;install 后prefix指定的目录下,既有安装后的x86版本的qtopia了
31.pc上模拟qtopia
我们使用工具qvfb来模拟qtopia,这里用2.2.0版本,根据30中步骤编译成功后:
qvfb -height 240 -width 320 &
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ARM/qtopia_x86
QTDIR=/usr/local/ARM/qtopia_x86
QPEDIR=/usr/local/ARM/qtopia_x86
/usr/local/ARM/qtopia_x86/bin/qpe &
如果,
想要开机启动自己做的东西,不要显示qtopia桌面的话,直接:
/usr/local/ARM/qtopia_x86/bin/music -qws&
31.linux配置网络
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.1.58 netmask 255.255.255.0
route add default gw 192.168.1.1
以上使用busybox 1.15
32.uboot操作nor flash和nand flash
习惯上nor flash被称作flash,nand flash被称作nand flash,很多情况下,涉及到nor和nand的读写
nor读
cp 0x10000000 0x22000000 0x50000
从哪 到哪 长度
nor写
cp 0x22000000 0x10000000 0x50000
从哪 到哪 长度
nand读
nand read 0x22000000 0xa0000 0x200000
到哪 从哪 长度
nand write 0x22000000 0xa0000 0x200000
从哪 到哪 长度
33.uboot自行执行命令的方法
在需要执行某命令的地方运行函数run_command("","")即可,如:
run_command("nand read 0x22000000 0xa0000 0x200000;bootm", "");
即可自动执行了
34.linux的io重定向
a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;
c、 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;
d、 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;
e、 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;
f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;
g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
cmd > file 把 stdout 重定向到 file 文件中;
cmd >> file 把 stdout 重定向到 file 文件中(追加);
cmd 1> fiel 把 stdout 重定向到 file 文件中;
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;
cmd 2> file 把 stderr 重定向到 file 文件中;
cmd 2>> file 把 stderr 重定向到 file 文件中(追加);
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat <>file 以读写的方式打开 file;
cmd < file cmd 命令以 file 文件作为 stdin;
cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符
35.终端语法高亮
终端分为两种:1.本地 2.远程
本地一般是xterm,远程则是secureCRT之类
apt-get install vim 即可替代原有vi无语法高亮的不足
secureCRT中设置终端类型为xterm linux等,重新登录ssh,即可语法高亮
当然,也可修改/etc/vim/vimrc中的相关选项
36.ls或其他命令不能用
注意是不是无意间改变了so共享库的查找路径LD_LIBRARY_PATH,出现
ls: error while loading shared libraries: libc.so.6: ELF file OS ABI invalid
只需要修改回来即可
37.qtopia显示中文与中文化
显示中文两个条件:1.支持中文编码,如utf8。 2. 有中文字体,qtopia默认没有开启unicode支持,开启即可,qtopia的unifont支持中文,详细显示中文和中文化参照地址:http://blog.csdn.net/linucos/archive/2010/03/24/5413257.aspx
38.konqueror支持中文,qtopia能显示中文后,konqueror即可显示中文了,否则尝试选择相应字体或者重新编译
39.qtopia中文输入法
MurphyPinyin输入法,移植相当简单,不再赘述
40.arm linux LCD不能正常显示
一般的3.5的tft lcd默认是RGB的24bit模式,且RGB顺序是高位R低位B,屏幕一般不要初始化即可使用,不能正常显示的原因从以下几个入手:
<1>行长 帧长 行前 行后 帧前 帧后,决定了屏幕显示是否在正确位置,可能硬件没连接好,可能控制器信号没送出
<2>屏幕正常显示,但是闪动或抖动,可以查找clk速率的问题
<3>同时 行长 帧长 行前 行后 帧前 帧后 数据使能 时钟,几个信号的相位可能导致显示不出来或者显示不正常
<4>正常显示,但是颜色不正常,注意R和B的顺序,同时16bit模式下的555和565问题,可以配置linux内核到24位模式尝试
41.c程序加printf调试方法
#if defined(DBG)
#define dbg_printf(fmt,arg...) /
printf(fmt, ##arg)
#else
#define dbg_printf(...) /
do {}while(0);
#endif
#if defined(HYBRIDOS_SAMPLE_DEBUG) #define dbg_printf(fmt,arg...) do{printf(fmt, ##arg);}while(0) #else #define dbg_printf(fmt,arg...) do {}while(0) #endif
42.linux nand flash mtd分区技巧
可以把最后一个分区的.size设置成MTDPART_SIZ_FULL, /* Occupy rest of flash */ ,表示剩余大小
43.jffs2文件系统制作注意
mkfs.jffs2 -r xxx -o xxx.jffs2 -e 擦除大小 -n 没有clean marker -p 不指定大小填充到最后一个eraseblock
一般擦除大小根据nand 手册确定,64M为0x4000 即16K,128M为0x20000 即128K
44.注意mac地址哦
ifconfig eth0 down
ifconfig eth0 hw ether 00:00:AA:BB:CC:DD
ifconfig eth0 up
45.让linux内核支持yaffs2
需要给内核打个补丁(2.6.30),之后内核配置的时候选择下,制作工具分为大page和小page区别,制作即可
46.linux内核解压后停止
出现:
Uncompressing Linux................................................................................................................................ done, booting the kernel.
停止
解决办法,可以尝试bootargs添加mem参数
47.linux驱动架构简单跟踪
linux驱动架构,主要是分层,便于管理咯:比如声音的驱动,先要添加设备,之后再初始化驱动,添加platform设备便于管理,真正的工作在驱动中做
module_init(at91uda1341_init);
上边的init函数中调用了2个关键函数:
at91_add_device_at91uda1341 和 platform_driver_register
这个其实是注册了设备的,注册的设备过程中,最主要的也是初始化了需要用管脚,当然放到驱动初始化中也行,为什么要放在这里呢?才像是告诉后来的设备,这个管脚已经使用了,如果检测到被用了,干脆设备都不要注册了~因为冲突了~module_exit指定的函数会自动调用的,放在特殊的段里~
还有个关键函数是 snd_at91uda1341_probe();
这个是初始化了函数了,除了管脚外,所有的初始化都放在probe里了~probe什么时候调用呢~?
踪影是:
platform_driver_register(&at91uda1341_driver); --》
driver_register(&drv->driver); --》
bus_add_driver(drv); --》
driver_attach(drv); --》
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); --》
注意参数__driver_attach,他其实是个函数指针
跟着bus_for_each_dev发现
fn(dev, data); fn其实是__driver_attach,
跟着__driver_attach
driver_probe_device(drv, dev); --》
really_probe(dev, drv); --》
drv->probe(dev); 此处是真正的probe函数被调用了的~
综上,也就是module_exit的时候,设备也添加了,驱动也初始化了~
总之呢,一个注册设备分配管脚,一个初始化驱动~
48.uboot的环境变量保存
--1--保存在nand
#define CONFIG_SYS_USE_NANDFLASH
#define CONFIG_ENV_IS_IN_NAND
--2--保存在nor
#define CONFIG_SYS_USE_FLASH
#define CONFIG_ENV_IS_IN_FLASH
其他编译时候缺什么宏,补上就可以了~
49.uboot环境变量保存地址
#define CONFIG_ENV_OFFSET 0x60000
即是相对存储设备的偏移
50.make menuconfig中本来有的选项没有出现,不能选择
检查下,是不是依赖哪个依赖的条件没有被选中,选中即可
51.如何去掉make menuconfig中的依赖关系
所用模块的文件夹下找kconfig脚本,找到你想找的项目,下面会发现:
config TOUCHSCREEN_AD7877
tristate "AD7877 based touchscreens"
depends on SPI_MASTER
depends on字样就是依赖关系,去掉即可显示了,但是会依赖其他问题,那是后话
52.linux下gpio中断问题
error = request_irq(gpio_to_irq(AT91_PIN_PA21),
uh7843_ts_interrupt,
0,
"Touchscreen driver", pdev);
一般这样申请,注意如果改成
error = request_irq(gpio_to_irq(AT91_PIN_PA21),
uh7843_ts_interrupt,
IRQF_SHARED,
"Touchscreen driver", pdev);
申请失败,原因还没有探究
53.linux输入子系统理解
linux输入子系统分为3层来理解:
--1--driver
驱动硬件,需要想core层注册输入设备,所有的信息通过标准消息通知core
--2--core
处理核心,与驱动关系不大
--3--event handle
事件处理,针对不同的设备有不同的时间,具体见driver/input/evdev.c,设备文件也是在此建立的,现在大多event handler都用此文件
54.arm汇编点灯
#if 0
mov r0, #0x1
mov r2, #0x0
str r0, [r2,#0xfffff800]
mov r0, #0x1
mov r2, #0x0
str r0, [r2,#0xfffff810]
mov r0, #0x1
mov r2, #0x0
str r0, [r2,#0xfffff830]
#endif
55.arm的C语言点灯
void shine_led(void)
{
volatile unsigned int cnt = 0;
volatile unsigned int dly = 0;
*((unsigned int*)(0xfffff800 + 0x0)) = (0x1<<0);
*((unsigned int*)(0xfffff800 + 0x10)) = (0x1<<0);
for (cnt = 0; cnt < 6; ++cnt)
{
if(cnt%2)
*((unsigned int*)(0xfffff800 + 0x30)) = (0x1<<0);
else
*((unsigned int*)(0xfffff800 + 0x34)) = (0x1<<0);
for(dly = 0; dly < 50000; ++dly);
for(dly = 0; dly < 50000; ++dly);
for(dly = 0; dly < 50000; ++dly);
}
}
56.内建环境变量
#define CONFIG_IPADDR 192.168.1.158
#define CONFIG_ETHADDR 12:34:56:78:90:12
#define CONFIG_SERVERIP 192.168.1.60
57.shell判断文件存在与否
ptcf="/etc/pointercal"
if [ ! -f "$ptcf" ]; then
/etc/tslib/bin/ts_calibrate
fi
57.uboot保存环境变量技巧
有时候我们需要nfs和mtd切换启动,复制粘贴不放心,敲来敲去麻烦,可以使用下面的方法,看例子即知道怎么做
ba0=console=ttyS0,57600 root=/dev/mtdblock0 rw init=/linuxrc rootfstype=jffs2
ba1=console=ttyS0,57600 root=/dev/nfs rw nfsroot=192.168.1.60:/home/linucos/newmsg/nfsroot_busybox nfsaddrs=192.168.1.192:192.168.1.60:192.168.1.1:255.255.255.0 mem=64M
bootargs=console=ttyS0,57600 root=/dev/mtdblock0 rw init=/linuxrc rootfstype=jffs2
实际上其中的bootargs设置是这样的
setenv bootargs $(ba0)
也就是uboot可以定义环境变量的,这样,切换启动方式方便至极
58.arm-linux登录多个串口终端自动登录
inittab中
::respawn:/sbin/getty -n -l /bin/autologin 57600 ttyS2
ttyS0::respawn:/bin/login root
这样写,实际上login能够实现自动登录的,但是不能设置波特率,但是getty可以的,但是换做getty的话,自动登录要经过一个脚本,
/bin/autologin内容如下
#! /bin/sh
/bin/login -f root
以上设置可以实现多串口登录,且自动登录
59.ubuntu9.10更新源
gedit /etc/apt/sources.list
网上找找好源
类似
deb http://tw.archive.ubuntu.com/ubuntu/ karmic main universe restricted multiverse
deb http://tw.archive.ubuntu.com/ubuntu/ karmic-updates universe main multiverse restricted
deb http://tw.archive.ubuntu.com/ubuntu/ karmic-proposed universe main multiverse restricted
deb http://tw.archive.ubuntu.com/ubuntu/ karmic-security universe main multiverse restricted
deb http://tw.archive.ubuntu.com/ubuntu/ karmic-backports main multiverse restricted universe
deb-src http://tw.archive.ubuntu.com/ubuntu/ karmic main universe restricted multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu/ karmic-security universe main multiverse restricted
deb-src http://tw.archive.ubuntu.com/ubuntu/ karmic-updates universe main multiverse restricted
deb-src http://tw.archive.ubuntu.com/ubuntu/ karmic-proposed universe main multiverse restricted
deb-src http://tw.archive.ubuntu.com/ubuntu/ karmic-backports universe main multiverse restricted
保存后,
aptitude update #更新列表
ok~看看有没有可用的软件吧~
60. 查看linux内核支持的架构
根目录下 ls arch/arm/configs/
61. ubuntu备份好工具
remastersys
62.ubuntu设置终端语言
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8