首 页 关于华恒 产品服务 技术支持 联系我们 诚聘英才  
产品服务
嵌入式开发板
行业解决方案
OEM & ODM
教学实验系统
软件产品服务
嵌入式应用模块
开发工具
相关资料
 
华恒HHARM系列嵌入式Linux开发板常见问题解答
——ARM7/ARM9/XSCALE
(华恒科技版权所有)
华恒科技ARM产品技术支持信箱:hharm-support@hhcn.com

1、华恒的ARM系列产品是否支持ARM ADS(SDT)调试?
通过华恒ARM系列产品附带的JTAG烧写工具可以在Windows下使用 Arm Developer Suit (ADS)/SDT 来进行ARM/THUMB模式的C、C++和ASM直接进行源代码级调试和开发。
(1)首先请在 http://www.beyondlogic.org/ 下载安装PortTalk。
(2) 然后下载 http://www.luckmcu.com/Down/JTAG.exe 并把这个文件拷贝到PortTalk的安装目录。
(3)在此目录下为AllowIO.exe建立一个快捷方式,在快捷方式的属性对话框中输入目标路径:“[ PortTalk所在路径 ]\AllowIo.exe JTAG.exe /a ”
如果PC操作系统为Win98则只需下载
http://www.luckmcu.com/Down/JTAG.exe
假定您的连接开发板和运行JTAG.EXE的计算机的IP为192.168.1.113, 则按照以下步骤:
(1)将开发板通过JTAG和计算机连接。
(2)双击运行为AllowIO建立的快捷方式。
(3)运行AWD或ARM Debugger后在Debugger Configuration中设定Target Environment为Remote_A,然后
点击Configure按钮,选择Ethernet模式,IP设置为192.168.1.113, 选中HeartBeat选项。
(4)全部配置完毕。

2、关于嵌入式Linux

鉴于ARM7系列平台全部为NOMMU系统,它上面运行的都是uClinux,因此关于这部分的uClinux相关的常见问题可参阅华恒HHCF(uClinux)系列产品常见问题解答:
http://www.hhcn.com/chinese/hhco5272r1faq.html

3、关于AT91烧写的问题
操作目录/HHARMAT91-R1/jtag-rw ;mincom波特率:38400;采用串口下载的方式。
大致步骤:先通过JTAG烧写redboot.bin到flash(以后可以不用接JTAG直接烧写),然后烧写linux.bin,最后烧写romfs.img
(1)、 ./AJFlash A -f redboot.bin -s 0 -l 131072
(131072为0x80000的十进制数, 表示写入的字节数, 应大于linux.bin的长度) (此命令你可以做成一个批处理文件,省去执行这么一长串的命令) 烧写完后拔掉电源,再拔去jtag烧写器接口(不要带电拔插)。
(2)、重启开发板,在minicom中显示的信息应如下所示:RedBoot> ),在此提示符下键入fis init
(3)、 load -r -v -b 0x02020000 -m xMODEM
然后按Ctrl-A S(先按Ctrl+A, 松开再按S), 在出现的菜单里选择xMODEM传送方式,这时minicom会显示文件选择对话框,提示你输入要传送的文件名称,直接按回车, 输入uClinux内核镜像的文件名,比如/HHARMAT91-R1/image/linux.bin,回车,如果一切顺利,就可以看到传送进度窗口显示出来,大概2,3分钟可以传完。 但若要选择路径的话,可用空格键和上下键头键配合选择不同的路径。如果时间很短,还没有看到传输进度minicom就提示你"Press any key to continue…",说明操作失败,应重试一次。至此我们已经将linux.bin传送到目标板的内存中了,下面我们要将其烧写到Flash的0x01020000地址中。
(4)、fis create -b 0x02020000 -f 0x01020000 -l 0x80000 -r 0x02020000 linux
这样,便将linux.bin烧写到0x01020000开始的Flash空间中。
烧写romfs的命令类似如下:
(5)、load -r -v -b 0x021a0000 -m xMODEM
(6)、fis create -b 0x021a0000 -f 0x01100000 -l 0x40000 -r 0x021a0000 romfs
(一切正常操作以后, 运行fis list命令,应该看到如下信息:
RedBoot> fis listName FLASH addr Mem addr Length Entry pointRedBoot 0x01000000 0x01000000 0x00020000 0x00000000RedBoot config 0x011EF000 0x011EF000 0x00001000 0x00000000FIS directory 0x011FF000 0x011FF000 0x00001000 0x00000000linux 0x01020000 0x02020000 0x00080000 0x02020000romfs 0x01100000 0x021A0000 0x00040000 0x021A0000
然后运行)
(7)、在Redboot>提示符下键入fconfig命令(此命令是配置脚本,省去每次都要装linux和romfs)
(8)、在Redboot提示符下把false改为true,就会出现>> 提示符,键入如下三行加一个回车后
fis load linux
fis load romfs
go 0x02020000
(回车)
设置启动延时时间为1秒,即输入1,你也可以输入大一点的值。最后按y键确认。按复位键启动后,就可以看到漂亮的uClinux文字图像了。

4、如何对HHARM44B0上的SIO操作?
44B0处理器支持一个通道的SIO,要为SIO编程需要按以下步骤:
设置SIOCON寄存器。
使用中断模式时要设置串行IO中断使能寄存器。
如果要发送数据,把要发送的数据写到SIODAT寄存器。
把SIOCON[3]设置为1启动 SIO 接受/发送。
接受/发送完毕将会产生一个SIO中断,此时SIODAT中的数据为接收到的数据或为空。
返回步骤3,开始新的一轮传送。
以下是一个在SIO的Txd即HHARM44B0 Linker2的B14脚发送一个0xFF的例子:
*(volatile unsigned long*) SIOCON = 0x00000028;
*(volatile unsigned long*) SBRDR = 0x00002580;
*(volatile unsigned long*) IVTCNT = 0x00000004;
*(volatile unsigned long*) SIODAT = 0x000000FF;
*(volatile unsigned long*) SIOCON |= 0x00000008;

5、编译重烧启动时出现“unable to open an initial console”问题的解决办法
rpm -e genromfs
cd /HHARM4510-R2/tools
rpm -i genromfs-0.5.1-1.i386.rpm
或者直接在/HHARM4510-R2/tools下面
rpm -U genromfs-0.5.1-1.i386.rpm
然后重新编译即可

6、关于HHARM4510平台内核的编译过程
很多客户反映HHARM4510平台软件的编译问题:
4510的整个编译过程需要按以下步骤进行:
make dep
make lib_only (编译库文件)
make user_only (编译用户程序)
make romfs (生成romfs文件系统)
make image (生成 romfs.o文件,第一次执行时会提示错误,不必理会,以后编译就不会再报错了。)
make
注意:下载烧写的文件是image.ram

7、HHARM4510 bios的编译及开发板IP地址的修改
HHARM4510-R2/bios/imgtools/param/param.c 大约128行 tftp_ipaddr。
编译bios的步骤:
cd / HHARM4510-R2/bios/imgtools/param/
make ire201_uclinux
cd / HHARM4510-R2/bios/
make //如果编译有错,提示head.S文件的第95行错误,那就把此行的msr cpsr_cf,r1改成msr cpsr,r1再执行make
cd / HHARM4510-R2/bios/img
make bios //就会生成bios.img文件,也就是使用JTAG烧写到flash中去的引导代码。

8、多重片选的问题的真正原因(感谢honeyandy大侠):
现象:用4510B的外部IO总线时,通过示波器上看到访问一次会出现4个ECSx波形,很奇怪!
另外发现使用ROM/FALSH/SRAM bank时,访问同一个bank,OE喝WE的低电平宽度相差很多倍,起码9~10倍。
如果兄弟们的设计中有DMA器件或者IO的数据端口面对的是FIFO,那么你实际访问时指针需要在你在bios里面设定的基础上加0x4000000,因为0~0x3FFFFFF的访问是受cache操作影响,4510B把不产生cache操作影响的区域映射到0x4000000之上,这是个虚地址。参看4510B手册第五章关于cache的说明!

9、提供S3C4510B的I2C内核驱动(感谢honeyandy大侠):
(1)、基于S3C4510B 自带的硬件I2C驱动
(2)、使用I2C中断方式操作
(3)、字符设备方式访问
(4)、支持各种SLAVE 地址器件,支持单字节,双字节的寄存器地址,支持页方式写。

10、关于烧写HHARM4510-R2
操作目录/HHARM4510-R2/.../jtag-rw-……/jtag-rw ;mincom波特率:19200;板子在烧写阶段(即bootloader阶段)的默认IP地址为: 192.168.2.101(这里是板子做TFTP SERVER,注意这个IP地址是不能ping通的,因为这时板子处于bootloader阶段,还有,Linux PC机的IP地址必须为192.168.2.xx,但不能是192.168.2.101,否则会与板子冲突)
还有,在烧写前,务必将板子先启动到linux阶段,然后ping一下Linux PC机,验证网络连接是否通畅,否则后面一开始烧写,出了问题都不知道是板子的问题还是网线压根不通,到那时也无法验证了,因为板子再也ping不通了。
大致步骤:先通过JTAG烧写bios.img到flash(以后可以不用接JTAG直接烧写image.ram),然后烧写image.ram
(1)、检测核心板、底板是否短路。若短路则重新焊接,若无短路,接上JTAG,接上9V电源,继续进行下一步。
(2)、进入操作目录(/HHARM4510-R2/.../jtag-rw-2003-09-03/jtag-rw)后,键入./flashpgm后则即可进行烧写,大概十分钟以后,会提示“Check OK”字样,说明烧写进去了,若出现Error=1或其它的情况,说明没有烧写进去。可能原因是地址线或数据线粘连。查一下核心板上的SDRAM旁边的两排插针。还有可能是Flash有问题。
(3)、若第2步烧写正常,可以启动开发板,在minicom中可以看到如下的选项。
Main Menu
1 - Run uClinux
2 - Load image to sdram and Run uClinux
3 - Burn image to flash
4 - Update BIOS(Pay attention!!)
5 - Read ram data
Please Select: 3(选择3 即可烧写image.ram,提示如下)
Mini TFTP Server 1.0 (IP : 192.168.2.101) - Update System Parameters
Usage (Windows 2000/XP) :
tftp -i 192.168.2.101 put <filename>
(4)、在宿主机的HHARM4510-R2/image目录下,键入如下的命令:(老大,您可千万别在minicom下执行这些命令呀!!)
[root@localhost image]# tftp 192.168.2.101
tftp> binary
tftp> put image.ram
Sent 1667684 bytes in 10.2 seconds
tftp>
这时在另一个TTY下的minicom中就会出现如下的提示信息
Starting the TFTP download...
..................................................
Update linux,Please wait several minutes...
Flash Erasing
Finish erasing,writing......Done,please press<ESC>
让你按ESC键即可启动uClinux了。若在此步没能从宿主机上下载image.ram,最大的可能是与网口芯片有关的器件可能有问题,还有网络上不能有相同的IP出现,建议用对接线。

11、关于HHARM2410开发平台
PDF手册下载链接
HHARM2410编译是用make zImage,不是make
编制自己的应用程序或者下载移植一些应用程序(例如boa/iptables/microwin等),都非常简单,只要在Makefile前面加如下三行即可:
CROSS = /opt/host/armv4l/bin/armv4l-unknown-linux-
CC = $(CROSS)gcc
AR = $(CROSS)ar
STRIP = $(CROSS)strip
编译过程如下:
/opt/host/armv4l/bin/armv4l-unknown-linux-gcc -c -o handpad.o handpad.c
/opt/host/armv4l/bin/armv4l-unknown-linux-gcc -o handpad handpad.o ../gui/graphic.o
这和在PC LINUX上编译开发应用程序完全一致,就只要更换一下编译器即可。

12、启动后minicom无法进入命令提示符的问题

目前我们提供的标准套件中,板子加电启动后,在minicom中可以看到启动信息的最后没有进入系统命令提示符,最后的几行信息如下:
createfont: (height == 0) using builtin font System (0)
createfont: (height == 0) using builtin font System (0)
createfont: (height == 0) using builtin font Helvetica (1)
然后就停在这里不动了。
这是因为我们启动执行microwin的例程malpha,没有加&后台运行符所致,用户只要在minicom里面,等板子启动完成后,按下ctrl+C,然后回车,就可进入命令提示符界面.或者重做RAMDISK,修改etc/init.d/rcS,将malpha改为malpha&即可。

13、关于HHARM2410触摸屏的使用
minigui里面完全支持触摸屏(treeview);对于microwin的测试,可在板子启动后,在minicom里面运行landmine,可用触摸屏点选三个BUTTON,例如QUIT等。
华恒还提供了单独的触摸屏测试代码,是/jffs2/guidemo里面的tp_gui。

14、关于mount U盘的问题:
一种办法,将一台REDHAT LINUX的机器上将U盘格式化成EXT2/EXT3格式的;
另外一种办法,不需要格式化U盘成EXT3/2的,只要在HHARM2410的内核配置中选中File systems中的对FAT/FAT32等文件系统的支持即可。
cd kernel
make menuconfig
File systems --->
<*> DOS FAT fs support
< > MSDOS fs support
<*> VFAT (Windows-95) fs support
然后重新编译make zImage,在重新烧写内核即可。

16、HHARM2410及HHARM9-EDU中ppcboot的烧写过程
大致过程:
(1)、在PC机的终端上通过JTAG烧写器把ppcboot.bin烧写到flash中;
(2)、按复位键重启板子,切换到minicom终端(作为开发板的终端),在SDMK2410#提示符下键入命令操作以下步骤;
(3)、下载、烧写内核zImage;
(4)、下载、烧写文件系统。

详细步骤:
第一步:在PC机的shell提示符下,键入以下命令进入Image目录,进行烧写ppcboot

cd /HHARM2410-R3/Images (cd /HHARM9-EDU/Images)
./flash (或./SJF2410 /f:ppcboot.bin)
会出现以下提示信息
+------------------------------------+
| SEC JTAG FLASH(SJF) v 0.3 |
| (S3C2410X & SMDK2410 B/D) |
+------------------------------------+
Usage: SJF /f:<filename> /d=<delay>
> S3C2410X(ID=0x0032409d) is detected.
[SJF Main Menu]
0:K9S1208 program 1:28F128J3A program 2:Memory Rd/Wr 3:Exit
Select the function to test:
键入 1 选择flash的类型,再键入 0 选择烧写在flash中的位置,然后就会开始通过JTAG烧写器烧写ppcboot,此过程需要约10分钟。
若以上过程没有异常退出,则烧写正常,尤其是其中这一句
> S3C2410X(ID=0x0032409d) is detected.可以判断jtag已经连接上CPU,若此句变成
ERROR: No CPU is detected(ID=0xffffffff).
则有可能是jtag没有插好,或是插反了,或是jtag坏了,导致没能找到CPU的ID号。
【注意】:jtag线有凸起的那边朝向核心板的外面,插到核心板的jtag插针上。如果使用了20针->10针的转接头,当插上JTAG到核心板上,留出PCB板多的一方朝向核心板的外面,如果插反了,会提示您没有找到CPU。

第二步:在已经烧写了ppcboot的开发板上,通过TFTP下载内核
按一下复位键:可以看到启动信息如下:
PPCBoot 2.0.0 (Dec 15 2003 - 09:41:17)
PPCBoot code: 33F00000 -> 33F15118 BSS: -> 33F18318
DRAM Configuration:
Bank #0: 30000000 64 MB
Flash: 16 MB
start linux now(y/n):
SMDK2410 # //需要立即按回车或其它键,让其停留在此提示符下,否则其会一直向下引导,可以按一下复位键,重复这一过程。
SMDK2410 # tftp 0x30008000 zImage // 在SMDKE#提示符下键入的命令,通过TFTP下载内核。
<DM9000> I/O: 8000300, VID: 90000a46
NetOurIP =c0a80278
NetServerIP = c0a8027a //【注意】这里c0a8027a是为十六进制的TFTP服务器的IP地址,十进制表示为192.168.2.122,即要求TFTP服务器的IP地址必须为192.168.2.122,这个地址是可以修改调整的,参见下面介绍。
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.122; our IP address is 192.168.2.120
Filename 'zImage'.
Load address: 0x30008000
Loading:
#################################################################
#################################################################
##################
done
Bytes transferred = 753148 (b7dfc hex) //【注意】括号中的数值表示刚下载文件的大小。
如果PC机上TFTP服务没有配置正确,或配置的TFTP服务器的IP地址和开板要求的不一致,会反复出现以下信息提示:
Retry count exceeded; starting again
NetOurIP =c0a80278
NetServerIP = c0a80219
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
ARP broadcast 3
ARP broadcast 4
ARP broadcast 5

第三步:烧写刚下载的内核
SMDK2410 # fl 0x1040000 0x30008000 0xe0000
说明: fl命令后的三个参数的意义为:第一个参数是烧写到Flash的地址;第二个参数是刚才通过tftp把文件下载到SDRAM中的地址;最后一个参数表示在烧写指定的文件时,在flash中给这个文件的空间大小,请注意最后一个参数的值一定要比刚才通过tftp命令下载的文件的大小要大,否则,刚才的文件只烧了部分,没有烧全。此值是由使用tftp命令下载的文件的大小确实的,在通过tftp命令下载的时候,最后会提示您(十六进制值的)文件的大小,保持最后4个数字为"0"就可以了。可以在ppcboot提示符下键入help查看fl命令的帮助。tftp命令和fl命令后的所有十六进制数值在键入命令时,0x前缀可以省略。
start_sect=0x2,end_sect=0x7
************erase sector 0x2***********
************erase sector 0x3***********
************erase sector 0x4***********
************erase sector 0x5***********
************erase sector 0x6***********
************erase sector 0x7***********
----------program sector 0x2---------
----------program sector 0x3---------
----------program sector 0x4---------
----------program sector 0x5---------
----------program sector 0x6---------
----------program sector 0x7---------

第四步:通过TFTP服务下载文件系统
SMDK2410 # tftp 30800000 ramdisk.image.gz
<DM9000> I/O: 8000300, VID: 90000a46
NetOurIP =c0a80278
NetServerIP = c0a8027a
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.122; our IP address is 192.168.2.120
Filename 'ramdisk.image.gz'.
Load address: 0x30800000
Loading:
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
##
done
Bytes transferred = 1672929 (1986e1 hex)

第五步:烧写刚下载的文件系统
SMDK2410 # fl 1140000 30800000 220000
start_sect=0xa,end_sect=0x16
************erase sector 0xa***********
************erase sector 0xb***********
************erase sector 0xc***********
************erase sector 0xd***********
************erase sector 0xe***********
************erase sector 0xf***********
************erase sector 0x10***********
************erase sector 0x11***********
************erase sector 0x12***********
************erase sector 0x13***********
************erase sector 0x14***********
************erase sector 0x15***********
************erase sector 0x16***********
----------program sector 0xa---------
----------program sector 0xb---------
----------program sector 0xc---------
----------program sector 0xd---------
----------program sector 0xe---------
----------program sector 0xf---------
----------program sector 0x10---------
----------program sector 0x11---------
----------program sector 0x12---------
----------program sector 0x13---------
----------program sector 0x14---------
----------program sector 0x15---------
----------program sector 0x16---------
SMDK2410 #
按一下开发板上的复位键,就可看到开发板的整个启动过程了。
说明:TFTP服务器IP是在ppcboot中指定的,用户可以修改开发板和TFTP服务器的IP。
vim ppcboot-2.0.0/include/configs/smdk2410.h
修改如下一行:
#define CONFIG_SERVERIP 192.168.2.122 //122.2.168.192
然后重新编译ppcboot,编译步骤,请见下一个问题。重新烧写新的ppcboot.bin,就可从用户指定的IP下载烧写了。

17、关于ppcboot-2.0.0-OK的编译问题:
若在RH9.0下直接make编译有问题的话,请尝试如下操作:
make distclean
make smdk2410_config
make
若还是在这个文件ppcboot-2.0.0/tools/gdb/astest.c处出错: 说true不认识。
可直接将true改为1即可通过编译。
其实,对于所有采用ppcboot或者u-boot的平台,编译方法都是一样的,首先必须阅读目录下的README文件,里面给出了所有支持平台的NAME_config
U-Boot is intended to be simple to build. After installing the
sources you must configure U-Boot for one specific board type. This
is done by typing:
make NAME_config
where "NAME_config" is the name of one of the existing
configurations; the following names are supported:
ADCIOP_config GTH_config TQM850L_config
ADS860_config IP860_config TQM855L_config
AR405_config IVML24_config TQM860L_config
CANBT_config IVMS8_config WALNUT405_config
CPCI405_config LANTEC_config cogent_common_config
CPCIISER4_config MBX_config cogent_mpc8260_config
CU824_config MBX860T_config cogent_mpc8xx_config
ESTEEM192E_config RPXlite_config hermes_config
ETX094_config RPXsuper_config hymod_config
FADS823_config SM850_config lwmon_config
FADS850SAR_config SPD823TS_config pcu_e_config
FADS860T_config SXNI855T_config rsdproto_config
FPS850L_config Sandpoint8240_config sbc8260_config
GENIETV_config TQM823L_config PIP405_config
GEN860T_config EBONY_config FPS860L_config
ELPT860_config cmi_mpc5xx_config NETVIA_config
at91rm9200dk_config omap1510inn_config MPC8260ADS_config
omap1610inn_config

18、关于SD卡驱动的使用:
将光盘上的mmcsd-driver.tar.gz解压后可得到如下三个.o文件:
mmcsd_core.o
mmcsd_disk.o
mmcsd_slot.o
将其加到ramdisk里面,烧写到板子上,启动后在minicom中执行:
# cat /proc/devices
Character devices:
1 mem
2 pty/m%d
3 pty/s%d
4 vc/0
5 console
7 vcs
10 misc
29 fb
81 video_capture
162 raw
180 usb
204 ttyS%d
205 cua%d
220 gpiotest
254 s3c2410-ts
Block devices:
1 ramdisk
7 loop
这时加入SD卡驱动:
# insmod mmcsd_core.o
# insmod mmcsd_slot.o
MMC/SD Slot initialized
# insmod mmcsd_disk.o
Partition check:
mmca: p1
这时minicom里会打印出检测到卡设备的信息:
这时再执行:
cat /proc/devices
可看到Block devices里面多了mmc的设备信息:
Block devices:
1 ramdisk
7 loop
60 mmc
# cat /proc/partitions
major minor #blocks name
60 0 61312 mmc/disc0/disc
60 1 61292 mmc/disc0/part1
【注意】
上面列出的60 1就是设备的主次设备号,注意这个设备是在检测到SD卡后自动创建的。
然后执行如下命令加载:
mount /dev/mmc/disc0/part1 /mnt
若加载不成功,则有可能是SD卡上的文件系统损坏了,建议拿到PC或者其它设备上格式化一下,我们的板子上也可以提供格式化工具,mke2fs,可格式化成EXT2或者EXT3格式(mke2fs -j),例如格式化成EXT2格式:
# mke2fs_2410 /dev/mmc/disc0/part1
mke2fs 1.25 (20-Sep-2001)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
15360 inodes, 61292 blocks
3064 blocks (5.00%) reserved for the super user
First data block=1
8 block groups
8192 blocks per group, 8192 fragments per group
1920 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345
Writing inode tables: done
Writing superblocks and filesystem accounting information:
done
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
#
# mount /dev/mmc/disc0/part1 /mnt
ext3: No journal on filesystem on mmc(60,1)
# cd /mnt
# ls
lost+found
#
【注意】
在HHARM2410里面增加一些启动执行的命令,例如修改IP等,要注意ramdisk里面以下两个启动rc脚本文件:
mnt/etc/init.d/rcS
内容如下:
#!/bin/sh
/bin/mount -a
inetd
mknod /dev/sda1 b 8 1
mknod /dev/sda2 b 8 2
mknod /dev/sdb1 b 8 17
mknod /dev/sdb2 b 8 18
mknod /dev/sdc1 b 8 33
mknod /dev/video0 c 81 0
mknod /dev/fb0 c 29 0
mknod /dev/tty0 c 4 0
mknod /dev/mmcsd1 b 60 1
exec /usr/etc/rc.local
另一个文件就是:
usr/etc/rc.local

19、HHARM2410-R3中关于关闭SHELL对串口的占用,使之能做普通的串口通信和拨号
在HHARM2410-R3/kernel下执行make menuconfig
Character devices --->
Serial drivers --->
[*] S3C2410 serial port support
[ ] Console on S3C2410 serial port 【注】去掉这项即可,不必修改busybox/init.c了
< > 8250/16550 and compatible serial support (EXPERIMENTAL)

20、关于HHARM9平台上U盘的使用
很多客户反应ARM9平台(2410等)对U盘的支持有问题,但实际上LINUX对U盘本来就很挑剔,你在REDHAT下用U盘也经常出现IO错误的信息。而且现在很多U盘质量很差,很多著名的品牌的U盘都很滥。好像只有三星的比较稳定。
再有就是,反复拔插U盘,则可能设备名就不是mount /dev/sda1 了,设备名就变化了,例如就会变成sda4了,具体应该是是哪个设备,唯一判断的依据就是:
cat /proc/partitions
看里面列出的xxxx/part0/1/xxx之类的前面给出的主次设备号,例如显示是8 33的话,
# cat partitions
major minor #blocks name
8 0 32128 scsi/host0/bus0/target0/lun0/disc
8 33 32080 scsi/host0/bus0/target0/lun0/part1
mknod /dev/sda33 b 8 33
mount /dev/sda33 /mnt
之所以要手工创建设备,是因为系统只默认创建了sda1/sda2,其它的要自己手工创建了
再看看下面的情况
~ # cat /proc/partitions
major minor #blocks name
8 0 32128 scsi/host0/bus0/target0/lun0/disc
8 1 32080 scsi/host0/bus0/target0/lun0/part1
8 16 32128 scsi/host1/bus0/target0/lun0/disc
8 17 84344761 scsi/host1/bus0/target0/lun0/part1
8 18 934940732 scsi/host1/bus0/target0/lun0/part2
8 20 1717556736 scsi/host1/bus0/target0/lun0/part4
~ # mount /dev/sdb1 /tmp
VFS: Can't find ext2 filesystem on dev sd(8,17).
FAT: bogus logical sector size 30583
VFS: Can't find a valid FAT filesystem on dev 08:11.
mount: Mounting /dev/sdb1 on /tmp failed: Invalid argument【mount不成功】
~ # mknod /dev/sda18 b 8 18
~ # mount /dev/sda18 /tmp
VFS: Can't find ext2 filesystem on dev sd(8,18).
FAT: bogus logical sector size 9509
VFS: Can't find a valid FAT filesystem on dev 08:12.
mount: Mounting /dev/sda18 on /tmp failed: Invalid argument 【mount不成功】
~ # mknod /dev/sda20 b 8 20
~ # mount /dev/sda20 /tmp
VFS: Can't find ext2 filesystem on dev sd(8,20). 【mount成功】
~ # cd /tmp
/etc/tmp # ls
hhtech-product-V1.0.ppt
从上面可以看到,同一个U盘显示有三个分区,但前两个都mount不上,而只有最后一个才行。
若上述操作都没有问题,但还是mount不上,重启板子即可。

21、关于RAMDISK的介绍:
建议先阅读如下好文章:
http://lists.arm.linux.org.uk/pipermail/linux-arm/2001-February/000545.html
HHARM2410标配有16M的FLASH和64M的SDRAM,所以可以支持很多的大应用。目前提供支持的有minigui和microwin,且均已经很好的支持并集成了触摸屏功能。
需要修改内核的一个配置
cd kernel
make menuconfig
Block devices --->
< > Normal PC floppy disk support
< > XT hard disk support
<*> Loopback device support
< > Network block device support
<*> RAM disk support
(8192) Default RAM disk size
[*] Initial RAM disk (initrd) support
上面原来的值4096,改为8192即可支持大到8M的RAMDISK。
如何使用ramdisk?
就是要把ramdisk.image.gz解压后mount -o loop 到一个目录上,这样就可以看到ramdisk里面的文件系统内容,这时再把你的新编译的busybox的可执行文件复制到这个目录的bin目录下面覆盖原来的,再umount这个目录,再gzip压缩,这样你所作的改动就被带到这个新生成的ramdisk.image.gz文件里面了,然后你烧写这个文件就可以看到新世界了。
简单命令序列:注意要自己调整目录路径
gunzip ramdisk.image.gz
mkdir tmnt
mount -o loop ramdisk.image tmnt
cp -f busybox tmnt/bin
umount tmnt
gzip ramdisk.image
关于RAMDISK的大小问题,有两个概念,一个是ramdisk在内存中解压后的容量,例如我们常说的8M、4M、6M的RAMDISK,它耗用的是板子SDRAM的空间;还有一个就是压缩后的ramdisk.image.gz文件的大小,它耗用的是板子的FLASH的空间。例如8M的RAMDISK,根据里面空间的占用率,里面填的文件、目录内容越多,压缩出来的ramdisk.image.gz的文件就越大,例如会达到3MB以上,但HHARM2410对压缩后文件大于3MB的ramdisk支持不是很好,所以建议不要将我们标配的8MB 的ramdisk里面加的内容太多,导致ramdisk.image.gz过大,一般的,可将一些大的应用程序移到其它的文件系统里面去,例如cramfs等,RAMDISK里面空余的空间可留给系统启动后用于保存一些采集的数据以及计算的一些临时文件等。
关于去掉Ctrl+C才能进入SHELL的问题:
HHARM2410:前段时间客户反映说,不希望敲入回车才能进入SHELL,现在去掉这个东东,因为发现不敲回车进入SHELL的话,都无法TELNET板子 :-(
修改busybox的代码
以busybox 1。00 pre10为例:
在init/init.c 文件中
run()函数
if (a->action & ASKFIRST) {
//char c;
//messageD(LOG, "Waiting for enter to start '%s'"
// "(pid %d, terminal %s)\n",
// cmdpath, getpid(), a->terminal);
//bb_full_write(1, press_enter, sizeof(press_enter) - 1);
//while(read(0, &c, 1) == 1 && c != '\n')
// ;
}
系统在这里当第一次启动busybox的时候等待用户敲回车键
注释掉相应的部分就可以了。
这样系统启动以后就直接进入shell了

22、HHARM9200上一个BUG的修正:
修改如下红色部分:
cd HHARM9200/bootloader/simple_boot/
vim initboot.c
void AT91F_InitSDRAM()
...
/* SDRAM控制器寄存器的基址为:
Base Address: 0xFFFFFF90
*/
/* Init SDRAM */
pRegister = (int )0xFFFFFF98; /* SDRAMC Configuration Register */
*pRegister = 0x2188c159;
/* 逐位对照P204页的SDRAMC Configuration Register可得出:
NB=1表示4个BANK
NR=10 表示13行
NC=01表示9列
总共213+9+2×2×2=226=64MB
*/
...
修改完毕后,重新编译simple_boot代码,生成boot.bin,重新烧入FLASH即可。

23、HHARM9200上flash读写错误的问题
bootstap方式启动时在u-boot中读flash中的数据有错,需要修改一下FLASH的片选设置CS0如下:
在读写flash的代码之前的任意位置添加下面代码,例如就加到
u-boot-0.4.8/board/at91rm9200dk/at91rm9200dk.c 中的board_init()函数中如下代码:
*(volatile unsigned int*)0xffffff70 = 0x328f;
其实,这个可直接在u-boot启动的提示符下执行mw ffffff70 328f
即可,这时再用md读FLASH内容就不会有错误了。

24、关于HHARM9200上启动信息默认输出到VGA上
make menuconfig ---> Character devices ---> Serial drivers ---> 去掉Console on AT91RM9200 serial port
另外,HHARM9200板子启动默认的显示输出是VGA,若要显示到LCD上,需要执行一个切换程序,在minicom里面如下操作:
cd /jffs2
./videoshift
则立刻在LCD上有企鹅显示。
minigui的演示例子treeview可立即执行
treeview即可在LCD上有显示。

25、关于HHARM9200上U盘有时找不到的解决办法
修改bootloader/simple_boot/initboot.c中这样一句话:
#if QUARTZ_18432
#define PLLAR 0x202c3E03 /* 120 MHz for PLLA */
//#define PLLAR 0x20263E04 /* 120 MHz for PLLA */
//#define PLLAR 0x20393E04 /* 180 MHz for PLLA */
//#define PLLBR 0x10483E0E /* 48,054857 MHz (divider by 2 for USB) */
//#define PLLBR 0x205f3E0c /* 48,054857 MHz (divider by 2 for USB) */
#define PLLBR 0x17f83Eff /* 48,054857 MHz (divider by 2 for USB) */
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~改成
#define PLLBR 0x11973e33 /* 48,054857 MHz (divider by 2 for USB) */

26、HHARM9200的U-boot-0.4.8的编译
make distclean
make at91rm9200dk_config
make

关于HHARM9-EDU的一些软件使用说明
具体内容请详见实验指导书上册第二章,再有一个简单的用户初步拿到板子后的对各个接口的基本验收操作说明:PDF格式文件下载
这里仅做一些细节补充:

27、板子上除了提供minigui/microwin的演示例子外,还提供了一套华恒自己编写的GUI系统,这个是无窗口机制的小GUI系统,在板子的/jffs2/guidemo下面,可执行文件是tp_gui,这是个可用触摸屏控制的GUI代码例子,其中还有一个SOCKET通信的例子,就是在一台IP为192.168.2.100的LINUX PC上运行一个小程序,可将LINUX PC上的一个位图文件或者一个普通文件通过以太网传送到板子上,并在LCD上显示出来。这个在PC上运行的软件代码在:HHARM9-EDU/experiments/EXP18/app/2410-gui-demo-pc

28.为了兼容FREESCALE i.MX处理器,HHARM9-EDU的触摸屏没有采用S3C2410内置的AD通道,而是外扩了AD芯片,所以软件上也和HHARM2410开发板有所不同,以前的触摸屏驱动是静态编译到内核里面的,在kernel/drivers/char/s3c2410-ts.c,原来设备文件名为/dev/touchscreen/0raw,
现在是动态MODULES形式加载的,代码在:
HHARM9-EDU/experiments/EXP18/driver目录下,名为digi.o,现在叫做/dev/digi。许多触摸屏软件只要改这一处即可

29.还有,HHARM9-EDU实验箱可做MPEG4/MP3的解码演示,这些演示用的代码和MPEG4 AVI的电影文件一般无法放在板载的16MB FLASH里面,一般都要放在外部存储器里面,例如NFS 网络硬盘或者板子挂接的硬盘、CF卡、SD卡等。
最简单的就是用NFS来播放放在REDHAT LINUX PC硬盘上的电影文件。这些演示用的程序、代码、脚本和电影文件在:applications/video-demo下。演示时请将这个目录直接mount为板子的/mnt目录,因为你看我们演示是这样操作的:(在minicom等终端里面操作:)
cd /mnt
./rc-video(单视频,执行./rc-mp3单音频,执行./rc-mtv音视频同步解码播放)
我们来看看这个脚本的内容:
cat rc-video (这样就可以看到LCD上播放郑秀雯的MTV了)
#!/bin/sh
while(true)
do
cd /mnt
./mplayer -nosound zhenxiuwen.avi
done
可见,这里面指定了/mnt目录,你mount到其它目录就要改改这个小脚本了。

30、移植一个格式化硬件的工具:
去网上下载一个:e2fsprogs-1.35.tar.gz,具体下载地址(这些下载地址不要问人,直接google搜索即可找到):
http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.35.tar.gz
这里再给一个PC LINUX下常见软件的下载网站:
http://ftp.gnu.org/gnu/
这些应用程序从PC LINUX移植到ARMLINUX非常的容易,大多用下面这句./configure指定编译器后一次就可编译通过使用起来。
在REDHAT LINUX下解压,然后执行:
tar xzf e2fsprogs-1.35.tar.gz
cd e2fsprogs-1.35
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc ./configure --target=arm-linux
make
然后就OK了,就可以在misc目录下看到交叉编译出来的mke2fs工具,这个工具NFS mount到我们的HHARM9-EDU板子上(或者直接复制到/jffs2目录里面保存下来即可),用12V电源,接上IDE硬盘或者CF卡后,执行:
./mke2fs -j /dev/hda1
就可以格式化硬盘和CF卡了。
当然,硬盘不一定都是/dev/hda1,具体是hdax要看/proc/partitions,详见本文上面关于U盘/SD卡等的介绍,都是一个道理。

31、一些小的驱动和相关测试应用程序
对于HHARM2410基本底板的侧面有四个小按键,我们为它提供了一个小驱动和一个简单的应用程序来调用这个驱动做测试,代码分为驱动和应用程序:applications/keys4下面的keys4.c为驱动及其Makefile,驱动是以动态MODULES的形式加载的;applications/keys4/key里面为应用程序。
用法如下:
NFS mount上之后,在minicom里面执行
insmod keys4.o
这时你在板子上lsmod就可以看到这个驱动模块已经加载了。
然后执行cd key ; ./key
这时,用户按下板子上的小按键,就可以看到minicom里面显示各个键的键值(是随便定义的1~4)
这时,你ctrl+c停止key的执行后,再看看:
ls -l /dev/key*
就可以看到这个程序动态的为你创建了一个设备文件keys4,主设备号:138(在keys4.c驱动代码里面指定的),这个不需要手工创建设备mknod /dev/keys4 c 138 0,就是因为驱动代码里面是这样注册设备的:
static int __init keys4_init(void)
devfs_keys4 = devfs_register(NULL,"keys4",DEVFS_FL_DEFAULT,KEYS4_MAJOR, 0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP, &keys4_fops, NULL);
对应的,我们看看另外一个小驱动的测试代码:
我们HHARM2410还提供了一个GPIO测试的驱动和应用程序,就是选择GPIO_C8作为一个输出口线,通过用户在测试用的应用程序里面控制这个口线输出0或者1,即可高低电平。代码分为驱动和应用程序,驱动是静态编译到内核的(当然只要加入module_init就可以做动态MODULES加载了),在
/HHARM2410-R3/kernel/drivers/char下的gpio_test.c;
应用程序为/HHARM2410-R3/applications/write_gpio
相关代码:
驱动里面在open这个设备的时候设置这个口为输出(因为GPIO必须设置方向,做输入还是输出)
int gpio_open(struct inode *inode, struct file *filp)函数里面设置:
set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C8);
关键还是看看它的设备注册函数:
int __init gpio_init(void)
{
int i;
register_chrdev(IOPORT_MAJOR, "gpiotest", &gpio_ctl_fops);
return 0;
}
使用方法在对于这种情况就有所变化了,首先驱动已经静态编译到内核zImage,要通过烧写内核才能生效,而不是动态的insmod 了(从这里看出,把驱动做成MODULES方式是多么的方便,就和应用程序一样可以NFS mount调试了,而不必每次都要随内核烧写)
然后还是要NFS mount这个gpio_test应用程序可执行文件执行测试,但这之前必须在minicom里面手工创建驱动里面指定的设备文件:
mknod /dev/gpiotest c 220 0
然后才行执行
./gpio_test
【注意】
别搞混了,应用程序为/HHARM2410-R3/applications/write_gpio编译出来的可执行文件名字为gpio_test,设备文件名字指定为/dev/gpiotest
可以看出,用devfs_register注册的设备会自动创建/dev/下的设备文件,而用register_chrdev注册的设备则需要用户手工mknod创建设备文件

32、更新的ppcboot
支持动态改写tftp时的serverip,并可以直接保存且下次重启后,改动仍然生效。
改写serverip的步骤和格式如下:
在正常启动时,按ctrl+c进入smdk2410#提示符,在提示符下直接执行
例如原先的serverip为192.168.2.25
现改为192.168.2.110
格式为:
smdk2410#setenv serverip 192.168.2.110
设置
smdk2410#save
保存

33、板上MODULES形式驱动默认加载的列表:
~ # lsmod
Module Size Used by
mac_eeprom 3936 0 (unused) #用于setmac设置以太网MAC地址时读写EEPROM的驱动
electromotor 1488 0 (unused) #步进电机驱动,为/cramfs/sbin/motor_test所调用
2410audio 10928 0 (unused) #音频/dev/dsp驱动
led 1760 0 (unused) #LED驱动,为/cramfs/sbin/key所用
keybd 1872 0 (unused) #4×4小键盘驱动
RTC 3952 0 #RTC驱动,用于通过date命令设置系统时间写入RTC芯片X1227时调用
mmcsd_disk 3632 0 (unused) #SD卡驱动
mmcsd_slot 4016 0 (unused) #SD卡驱动
mmcsd_core 8768 1 [mmcsd_disk mmcsd_slot] #SD卡驱动
dm9000x 10720 2 #以太网驱动(以前是静态编译到内核的方式,新版本改为动态加载了)
digi 6064 1 #触摸屏/dev/digi驱动(普通的HHARM2410的触摸屏驱动用设备文件为/dev/touchscreen/0raw)

34、控制台上老是出现hub.c: Cannot enable port 2 of hub 1, disabling port.
hub.c: Maybe the US, 想去掉这些信息,请如下操作:
cd kernel
make menuconfig
USB support --->
<*> S3C2410 OHCI-compatible host interface support
(2) Maximum port(s) of RootHub
回车进入一个小界面,将上面这个2改为1,然后退出保存配置,make zImage,重烧内核即可。

35、HHARM2410或HHARM9-EDU中改变内核和文件系统烧写位置,避开坏扇区
改变flash中zImage和ramdisk.image.gz在flash中烧写的位置,只需要修改ppcboot-2.0.0/lib_arm/armlinux.c文件,以下红色字体的值的大小。
/*copy kernel and ramdisk from FLASH to SDRAM add by HHTECH*/
ret = memcpy((void *)0x30008000, (void *)0x40000, 0x100000); //zImage的相对位置是0x40000
…… …… ……
ret = memcpy((void *)0x30800000, (void *)0x140000, 0x440000);//ramdisk.image.gz的相对位置是0x140000。
例如,若烧写zImage时扇区被烧坏了,我们可以把以上值改成如下的值:
ret = memcpy((void *)0x30008000, (void *)0x140000, 0x100000);
…… …… ……
ret = memcpy((void *)0x30800000, (void *)0x240000, 0x300000);
假如这样改以后,下面烧写zImage和ramdisk.image.gz时,使用fl命令向flash中烧写zImage和ramdisk.image.gz时的位置就要作相应的修改,把其改成flash的起始地址加入上面的偏移量。
上面相应的缩小了ramdisk.image.gz这个文件所占用的空间大小,这样将不影响原来的后面的JFFS2和cramfs分区
若按以上修改,需要重新更新ppcboot,然后在ppcboo提示符下面下载和烧写zImage和ramdisk.image.gz,命令如下:
tftp 30008000 zImage
fl 1140000 30008000 f0000(或fl 140000 30008000 f0000:使用flash起始地址为0的ppcboot)
tftp 30800000 ramdisk.image.gz
fl 1240000 30800000 220000(或fl 1240000 30800000 220000)


中国·安徽 合肥市黄山路626号国家高新技术产业开发区银河大厦C座四层 (230088)
联系电话:0551-5325652/5325653/5325631/5325173/5333155/5333156/5333157  传真:0551-5325323 邮箱:market@hhcn.com
Copyright©1998-2008 HHTech.Co.,Ltd. All rights reserved. 华恒科技 版权所有