fl2440最小系统的移植遇到的问题

1.内核跑到如图所示死掉。是因为根文件系统在busybox中指定的文件地址不对,所以开发板启动时找不到文件。
   解决方法:重新指定路径,在linux3.0下,用ls命令查看到rootfs的路径。
    
2.Un compress Kernel不能解压内核是因为环境变量bootargs设置不对。
解决方法: set bootargs 'console=tty0(这里是传输给开发板屏幕) console=ttyS0(这里是电脑与开发板之间的传送端口),115200 men=64M rw loglevel=7'(最高级别,打印所有信息)
bootargs=console=tty0 console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs mem=64M noinitrd rw loglevel=7

linux通过bootargs来识别开发板烧录的是什么根文件系统。


3.mkimage命令找不到

是因为没有编译u-boot产生mkimage命令。

然后安装:sudo rpm -i uboot-tools-2011.03-1.el6.x86_64.rpm
4.Failed to execute:
原因是我自己在rootfs/下创建了以init文件夹,导致的问题。后我将文件删掉,并重新安装了busybox,在链接解决了faild to excute /init
第二个问题:在网上找了资料,说要将sudo vi /etc/selinux/config中的SELINUX值改为0,但是不行。
仔细查找了一些资料,并咨询了老师,有以下几种原因:
首先init链接是否在根目录树下,且不显示为红色;其次,在bin目录下是否有安装的busybox,是否能正常运行。(这个可以去找一个可以跑起来的内核,然后将busybox下载到开发板上,输入busybox看其能否正常工作);
2.内核读取时CRC错误,原因使用super vivi烧写内核文件到nand flash造成的错误,解释方法:直接在Uboot 里面使用tftp命令或者fatload usb 0:1 0x30008000 uImage(usb start u盘启动命令)将内核文件拷贝到内存,然后通过nand命令将文件写到nand flash中。

3.启动文件系统时提示无法获取文件系统的init文件,原因yaffs文件系统没有制作好,对于nand-flash大于128M的nand用mkimage2yaffs-128M进行制作,mkimage2yaffs-128M主要对增加了nand_ecc.c和ood校验的计算。

4.启动文件系统时Kernel panic - not syncing: Attempted to kill init!的错误,原因arm-linux-gcc交叉编译器为4.4.3需要在linux kernel配置里面增加EABI的支持。

Kernel Features  --->
            [*] Use the ARM EABI to compile the kernel                   
            [*]   Allow old ABI binaries to run with this kernel (EXPERIMENTA)

这样也不行

5.内核太老:gcc的编译的版本太高

是因为我这里交叉编译器用的linux3.5.0的内核,导致busybox支持linux3.5.0以上的内核版本,在将linu内核烧录到开发板上后,我用的是3.0的内核编译生成的文件,烧录linux内核启动后,会创建init进程来执行/init或/initrc程序,而这个程序就是busybox。busybox不能执行,就死在了init进程这里。所以我们要在制作交叉编译器的时候,在如图的选项中修改交叉编译器支持的内核:比如让它的内核为2.6.0,这样它就支持2.6.0及以上的版本了。


如图,进入以后如下界面,选择specific kernel version:



我这里默认是2.6.9,这里可以自己改

(注意下面出现的两这种问题是因为我的开发板是fl2440的板子,我直接下载的源码包,没有基于2410的config文件来改,所以一切都是重新开始编译。这是非常麻烦的。没有很好的功底不建议这样做,否则就会遇到很多的问题,不知道怎么修改)


解决办法:用补丁包将linux内核重新打包一下编译。


{这样就不会出现上面那个图,没有下图的选项:


昨天因为虚拟机奔溃了,导致我的文件全部不见了,悲伤是那么大,哎。然后今天就又重新编译了内核,结果又出现了问题,吐血。如图:


百度后成功解决了编译问题。

修改3个文件
arch/arm/mach-pxa/raumfeld.c       
drivers/input/touchscreen/eeti_ts.c
include/linux/input/eeti_ts.h      

raumfeld.c文件
 static struct eeti_ts_platform_data eeti_ts_pdata = {
  .irq_active_high = 1,
+ .gpio = GPIO_TOUCH_IRQ,
 };
static struct i2c_board_info raumfeld_controller_i2c_board_info __initdata = {
eeti_ts.c文件
  struct input_dev *input;
  struct work_struct work;
  struct mutex mutex;
- int irq, irq_active_high;
+ int irq, gpio, irq_active_high;
 };
 
 #define EETI_TS_BITDEPTH (11)

 static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv)
 {
- return gpio_get_value(irq_to_gpio(priv->irq)) == priv->irq_active_high;
+ return gpio_get_value(priv->gpio) == priv->irq_active_high;
 }

  pdata = client->dev.platform_data;
 
- if (pdata)
+ if (pdata) {
+ priv->gpio = pdata->gpio;
  priv->irq_active_high = pdata->irq_active_high;
+ }
 
  irq_flags = priv->irq_active_high ?
  IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING
eeti_ts.h文件
 struct eeti_ts_platform_data {
  unsigned int irq_active_high;
+ unsigned int gpio;
 };
红色的这一部分的错误是内核从头开始出现的错误。}




猜你喜欢

转载自blog.csdn.net/buhuiguowang/article/details/78493640