去年终结了ARM-wince移植的必杀技,几个简单的要点,现在总结了linux的关键要点如下,希望大家抛砖。把自己以前移植的wince和linux移植的一些简单要点都罗列了,希望大家提出更好的意见,或者指出我笔记的错误。
1.uboot传递给linux内核的nfs启动命令行:
setenvbootargsmem=64Mconsole=ttyS0,57600root=/dev/nfsrwnfsroot=192.168.1.6:/home/linucos/newmsg/nfsrootnfsaddrs=192.168.1.8:192.168.1.6:192.168.1.1:255.255.255.0
备注:自己ip:服务ip:网关:掩码
2.uboot传递给linux内核的nandflash上文件系统的命令行:
setenvbootargsconsole=ttyS0,57600root=/dev/mtdblock0init=/linuxrcrootfstype=jffs2
3.uboot传递给linux内核内存ramdisk文件系统的命令行:
setenvbootargsconsole=ttyS0,57600root=/dev/ram0rwinitrd=0x21100000,15360000init=/linuxrc
备注:initrd=指示文件系统在内存中的位置,压缩前大小;同时,内核要进行相应的配置
4.busybox下tftp命令使用:
tftp-rtmp-g192.168.1.6
得到服务器192.168.1.6上的tmp文件,-g表示get,-r表示remote,192.168.1.6表示服务器ip
同理,
tftp–ltmp–p192.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即可,如:
setenvbootargsconsole=ttyS0,57600console=tty0root=/dev/mtdblock0init=/linuxrcrootfstype=jffs2
(使用denx官方的文件系统,比较全面,很好)
可能是因为etc目录下配置文件被chmod以为改变权限,解决办法是:直接copy新的etc目录即可,同时注意保留修改过的profile等配置文件
8.普通linuxC程序简单休眠
包含#include
sleep(5);即可
9.修改root环境变量
编辑~/.bashrc文件,新增变量直接写变量如:
JAVA_HOME=/home/.../java所在文件夹
编辑已有变量如:
JAVA_HOME=$JAVA_HOME:/home/.../java所在文件夹
10.终端下快速进入埋藏很深的工作目录的方法
有时候工作目录会很深,简便的办法是:~/.bashrc下增加环境变量即可,如:
工作目录/home/..../works
增加环境变量WK=/home/..../works
exportWK
每次使用只有cd$WK即可
11.ubuntu图形界面用root权限操作
sudognome-open文件夹名称,如:
sudogonme-open/用root权限打开根目录了
12.SecureCRT终端回滚行数
有时候,终端结果回滚的行数会很多,有些错误被后边的行覆盖掉
设置会话选项-回滚缓冲区值就可以了,比如5000
13.linux开机logo制作方法
从最初的png图片,制作到最后的ppm图片
同样的方法将函数staticvoidfbcon_cursor(structvc_data*vc,intmode)用空函数替换
24.ubuntu停止和开启图形界面服务
/etc/init.d/gdmstop就可以停止图形服务
/etc/init.d/gdmstart开启图形服务
25.改变uboot和linux内核内容输出串口
uboot中简单的修改,include/configs/
#defineCONFIG_ATMEL_USART1#defineCONFIG_USART01#undefCONFIG_USART1#undefCONFIG_USART2#undefCONFIG_USART31/*USART3isDBGU*/原来是dbug口,undef后不使用了
linux中,一般在io_map下,两个内容需要做:
第一是添加相应串口设备,第二是注册相应串口为串口控制台,我的修改如下:
/*DBGUonttyS0.(Rx&Txonly)*/at91_register_uart(0,0,0);//原来的
/*USART0onttyS1.(Rx&Txonly)*/at91_register_uart(AT91RM9200_ID_US0,1,0);//新加的
/*setserialconsoletottyS0(ie,DBGU)*/at91_set_serial_console(0);//原来的
/*setserialconsoletottyS0(ie,uart0)*/at91_set_serial_console(1);//新加的
内核配置中,稍有修改,调整早期输出到相应串口选项即可,此选项一般在相应的板子类型下,我的修改成uart0
同时,uboot给linux传递参数注意添加console=ttyS1等
26.tar命令小结
tar-xvffoo.tarverboselyextractfoo.tartar-xzffoo.tar.gzextractgzippedfoo.tar.gztar-cjffoo.tar.bz2bar/createbzippedtararchiveofthedirectorybarcalledfoo.tar.bz2tar-xjffoo.tar.bz2-Cbar/extractbzippedfoo.tar.bz2afterchangingdirectorytobartar-xzffoo.tar.gzblah.txtextractthefileblah.txtfromfoo.tar.gz
27.cp命令小结
cpsourcetarget
28.jffs2文件系统制作
mkfs.jffs2-rrootfs-orootfs.jffs2-e0x4000-n
更多选项直接mkfs.jffs2help
29.给开发板增加域名解析
touch/etc/resolv.conf
那么怎么获取dns地址呢?也和简单的,因为开发板一般和主机用一个路由,所以呢,看看本机/etc/resolv.conf下面的地址就好了,如样添加即可,我的是:
nameserver202.101.172.35nameserver202.101.172.47
30.qtopia-2.2.0编译x86版本
进入源码根目录后,简单的:
./configure-qpe'-prefix=/usr/local/ARM/qtopia_x86'
make
makeinstall
-qpe是指qtopia的配置参数,同时-qte是指qt-embbed;install后prefix指定的目录下,既有安装后的x86版本的qtopia了
31.pc上模拟qtopia
我们使用工具qvfb来模拟qtopia,这里用2.2.0版本,根据30中步骤编译成功后:
qvfb-height240-width320&
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配置网络
ifconfiglo127.0.0.1
ifconfigeth0192.168.1.58netmask255.255.255.0
routeadddefaultgw192.168.1.1
以上使用busybox1.15
32.uboot操作norflash和nandflash
习惯上norflash被称作flash,nandflash被称作nandflash,很多情况下,涉及到nor和nand的读写
nor读
cp0x100000000x220000000x50000
从哪到哪长度
nor写
cp0x220000000x100000000x50000
nand读
nandread0x220000000xa00000x200000
到哪从哪长度
nandwrite0x220000000xa00000x200000
33.uboot自行执行命令的方法
在需要执行某命令的地方运行函数run_command("","")即可,如:
run_command("nandread0x220000000xa00000x200000;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、管道“|”(pipeline):上一个命令的stdout接到下一个命令的stdin;
cmd>file把stdout重定向到file文件中;cmd>>file把stdout重定向到file文件中(追加);cmd1>fiel把stdout重定向到file文件中;cmd>file2>&1把stdout和stderr一起重定向到file文件中;
cmd2>file把stderr重定向到file文件中;
cmd2>>file把stderr重定向到file文件中(追加);
cmd>>file2>&1把stderr和stderr一起重定向到file文件中(追加);
cmd 35.终端语法高亮 终端分为两种:1.本地2.远程 本地一般是xterm,远程则是secureCRT之类 apt-getinstallvim即可替代原有vi无语法高亮的不足 36.ls或其他命令不能用 注意是不是无意间改变了so共享库的查找路径LD_LIBRARY_PATH,出现 ls:errorwhileloadingsharedlibraries:libc.so.6:ELFfileOSABIinvalid 只需要修改回来即可 37.qtopia显示中文与中文化 38.konqueror支持中文,qtopia能显示中文后,konqueror即可显示中文了,否则尝试选择相应字体或者重新编译 39.qtopia中文输入法 MurphyPinyin输入法,移植相当简单,不再赘述 40.armlinuxLCD不能正常显示 一般的3.5的tftlcd默认是RGB的24bit模式,且RGB顺序是高位R低位B,屏幕一般不要初始化即可使用,不能正常显示的原因从以下几个入手: <1>行长帧长行前行后帧前帧后,决定了屏幕显示是否在正确位置,可能硬件没连接好,可能控制器信号没送出 <2>屏幕正常显示,但是闪动或抖动,可以查找clk速率的问题 <3>同时行长帧长行前行后帧前帧后数据使能时钟,几个信号的相位可能导致显示不出来或者显示不正常 <4>正常显示,但是颜色不正常,注意R和B的顺序,同时16bit模式下的555和565问题,可以配置linux内核到24位模式尝试 41.c程序加printf调试方法 #ifdefined(DBG)#definedbg_printf(fmt,arg...)/printf(fmt,##arg)#else#definedbg_printf(...)/do{}while(0);#endif #ifdefined(HYBRIDOS_SAMPLE_DEBUG)#definedbg_printf(fmt,arg...)do{printf(fmt,##arg);}while(0)#else#definedbg_printf(fmt,arg...)do{}while(0)#endif42.linuxnandflashmtd分区技巧 可以把最后一个分区的.size设置成MTDPART_SIZ_FULL,/*Occupyrestofflash*/,表示剩余大小 43.jffs2文件系统制作注意 mkfs.jffs2-rxxx-oxxx.jffs2-e擦除大小-n没有cleanmarker-p不指定大小填充到最后一个eraseblock 一般擦除大小根据nand手册确定,64M为0x4000即16K,128M为0x20000即128K 44.注意mac地址哦 ifconfigeth0downifconfigeth0hwether00:00:AA:BB:CC:DDifconfigeth0up 45.让linux内核支持yaffs2 需要给内核打个补丁(2.6.30),之后内核配置的时候选择下,制作工具分为大page和小page区别,制作即可 46.linux内核解压后停止 出现: UncompressingLinux................................................................................................................................done,bootingthekernel. 停止 解决办法,可以尝试bootargs添加mem参数 47.linux驱动架构简单跟踪 总之呢,一个注册设备分配管脚,一个初始化驱动~ 48.uboot的环境变量保存 --1--保存在nand #defineCONFIG_SYS_USE_NANDFLASH #defineCONFIG_ENV_IS_IN_NAND --2--保存在nor #defineCONFIG_SYS_USE_FLASH #defineCONFIG_ENV_IS_IN_FLASH 其他编译时候缺什么宏,补上就可以了~ 49.uboot环境变量保存地址 #defineCONFIG_ENV_OFFSET0x60000 即是相对存储设备的偏移 50.makemenuconfig中本来有的选项没有出现,不能选择 检查下,是不是依赖哪个依赖的条件没有被选中,选中即可 51.如何去掉makemenuconfig中的依赖关系 所用模块的文件夹下找kconfig脚本,找到你想找的项目,下面会发现: configTOUCHSCREEN_AD7877tristate"AD7877basedtouchscreens"dependsonSPI_MASTER dependson字样就是依赖关系,去掉即可显示了,但是会依赖其他问题,那是后话 52.linux下gpio中断问题 error=request_irq(gpio_to_irq(AT91_PIN_PA21),uh7843_ts_interrupt,0,"Touchscreendriver",pdev); 一般这样申请,注意如果改成 error=request_irq(gpio_to_irq(AT91_PIN_PA21),uh7843_ts_interrupt,IRQF_SHARED,"Touchscreendriver",pdev); 申请失败,原因还没有探究 53.linux输入子系统理解 linux输入子系统分为3层来理解: --1--driver 驱动硬件,需要想core层注册输入设备,所有的信息通过标准消息通知core --2--core 处理核心,与驱动关系不大 --3--eventhandle 54.arm汇编点灯 #if0movr0,#0x1movr2,#0x0strr0,[r2,#0xfffff800]movr0,#0x1movr2,#0x0strr0,[r2,#0xfffff810]movr0,#0x1movr2,#0x0strr0,[r2,#0xfffff830]#endif 55.arm的C语言点灯 voidshine_led(void){volatileunsignedintcnt=0;volatileunsignedintdly=0;*((unsignedint*)(0xfffff800+0x0))=(0x1<<0);*((unsignedint*)(0xfffff800+0x10))=(0x1<<0);for(cnt=0;cnt<6;++cnt){if(cnt%2)*((unsignedint*)(0xfffff800+0x30))=(0x1<<0);else*((unsignedint*)(0xfffff800+0x34))=(0x1<<0);for(dly=0;dly<50000;++dly); for(dly=0;dly<50000;++dly); }} 56.内建环境变量 #defineCONFIG_IPADDR192.168.1.158#defineCONFIG_ETHADDR12:34:56:78:90:12#defineCONFIG_SERVERIP192.168.1.60 57.shell判断文件存在与否 ptcf="/etc/pointercal" if[!-f"$ptcf"];then/etc/tslib/bin/ts_calibratefi 57.uboot保存环境变量技巧 有时候我们需要nfs和mtd切换启动,复制粘贴不放心,敲来敲去麻烦,可以使用下面的方法,看例子即知道怎么做 ba0=console=ttyS0,57600root=/dev/mtdblock0rwinit=/linuxrcrootfstype=jffs2ba1=console=ttyS0,57600root=/dev/nfsrwnfsroot=192.168.1.60:/home/linucos/newmsg/nfsroot_busyboxnfsaddrs=192.168.1.192:192.168.1.60:192.168.1.1:255.255.255.0mem=64Mbootargs=console=ttyS0,57600root=/dev/mtdblock0rwinit=/linuxrcrootfstype=jffs2 实际上其中的bootargs设置是这样的 setenvbootargs$(ba0) 也就是uboot可以定义环境变量的,这样,切换启动方式方便至极