linux-arm

260 阅读5分钟

arm-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相关目录)

  1. uboot传递给linux内核内存ramdisk文件系统的命令行:

setenv bootargs console=ttyS0,57600 root=/dev/ram0 rw initrd=0x21100000,15360000 init=/linuxrc

备注:initrd=指示文件系统在内存中的位置,压缩前大小;同时,内核要进行相应的配置

  1. 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

  1. 查看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图片

pngtopnm img.png > img.pnm\

pnmquant 224 img.pnm > img1.pnm\

pnmtoplainpnm img1.pnm > logo_linux_clut224.ppm

14.ln 软连接和硬链接之间的区别

ln -s file1 file2 表示建立file2,file2是file1的符号链接,也就是软连接,此时file1不一定存在

ln file1 file2 表示建立file2,file2是file1的硬链接,也就是inode备份,此时file1必须存在

 在同一个分区或者说 同一个文件系统 中, 多个文件的物理存贮位置一样, 只是目录项 分别在不同的目录下, 或者文件名(也是一个目录项) 各不相同. 这种存贮方式 是 硬连接. 如果要连接到另一个分区的目录下, 只能用软连接. ls -l 时可以看到, 软连接只是存了一个字符串, 通过这个字符串, 系统就可以访问其代表的文件. 如果是硬连接, ls -l 时可以看到文件的连接数. 删除一个硬连接, 其他文件ls -l时看到的连接数就少一个. 当删除最后一个连接时, 系统将释放该文件的存贮空间

例如:

三个文见 file1 file2 file3
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

15.busybox做的根文件系统出现Kernel panic - not syncing: No init found.  Try passing init= option to kernel.,或者明明目录先有文件却说can't execute './framebuffer': No such file or directory

常见原因以下两个:没有相应的so动态库,为什么没有报没有库却说No such file or directory,估计是因为busybox实现不标准;也可能是由于内核的编译器旧,而编译应用的编译器新,造成不能执行busybox或者应用

16.qtopia2.2.0使用usb鼠标和usb键盘

设置一下环境变量即可

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ARM/qtopia/lib
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

17.自动登录用busybox做的的根文件系统

busybox的init,似乎没有处理非登录用户的profile,所以很多东西不好处理,但是getty登录的话,每次要输入用户名,经过分析发现,

getty最终把用户名传递给了login,同时root可以配置成无密码登录,所以inittab脚本中,用以下方法自动登录root用户:

ttyS0::respawn:/bin/login root 其中ttyS0为控制tty,respawn等用法参见:

blog.csdn.net/linucos/arc…

18.insmod lsmod rmmod有时候需要在根文件系统的lib/modules/<内核版本如:2.6.32>/目录下存放模块

否则会出现类似:

insmod: chdir(2.6.26.6): No such file or directory rmmod: module 'hello_world' not found等错误

插入模块 insmod hello.ko,查看模块 lsmod,卸载模块 rmmod hello

19.konqueror配置语句

./configure --host=arm-linux --target=arm-linux --enable-embedded --enable-qt-embedded  --with-gui=qpe --disable-debug --enable-ftp --enable-static --disable-shared --disable-mt --with-extra-libs=/home/linucos/newmsg/tools/eldk41gcc40/arm/lib:/home/linucos/newmsg/gui/qtopia/qtopia-free-2.2.0/qtopia/lib:/usr/local/ARM/qtopia/lib:/usr/local/ARM/libs --with-extra-includes=/home/linucos/newmsg/tools/eldk41gcc40/arm/usr/include:/home/linucos/newmsg/gui/qtopia/qtopia-free-2.2.0/qtopia/include:/usr/local/ARM/includes -without-ssl --with-qt-dir=QTDIR:/usr/local/ARM/qtopiawithqtincludes=/home/linucos/newmsg/gui/qtopia/qtopiafree2.2.0/qt2/include:/usr/local/ARM/includeswithqtlibraries=/home/linucos/newmsg/gui/qtopia/qtopiafree2.2.0/qt2/lib:/usr/local/ARM/qtopia/libwithqtopiadir=QTDIR:/usr/local/ARM/qtopia --with-qt-includes=/home/linucos/newmsg/gui/qtopia/qtopia-free-2.2.0/qt2/include:/usr/local/ARM/includes --with-qt-libraries=/home/linucos/newmsg/gui/qtopia/qtopia-free-2.2.0/qt2/lib:/usr/local/ARM/qtopia/lib --with-qtopia-dir=QPEDIR:/usr/local/ARM/qtopia/

结论是,部分库没有找到时候可以这样,:号分开所有可能的lib和include即可

20.printk输出级别和默认级别

没有指定日志级别的printk语句默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL(这个默认级别一般为<4>,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到
日志级别一共有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");即可

21.qtopia会出现各种诡异问题

qtopia出现问题时,很多情况下,不是大问题,而是环境变量的问题,如设置mouse,导致串口不能用,设置keyboard,导致鼠标不好用等等

22.qtopia关键代码位置

qtopia-2.2.0基本就在qtopia_root/qt2/src/kernel/Qgfxraster_qws.cpp附近

23.去掉linux开机logo上的光标

   在内核的当前目录进入到drivers/video/console/fbcon.c文件
将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 外网不行,因为没有设置域名解析服务器,解决办法也很简单:

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", "");

即可自动执行了