分类 App 下的文章

android studio gradle的问题

1、相信大家都遇到每次升级了android studio之后,gradle又要同步的这个痛苦过程,因为gradle被墙,所以只能用其他办法下载压缩包。
2、自定义gradle路径每次都要麻烦一下,这次采用官方推荐的办法,不知道会不会也存在一样的问题,如下图所示:
gradle.png
3、下载gradle并配置
gradle2.png
下载下来的安装包放到gradle配置的相应目录,默认如下图,注意对应的版本号和路径
gradle3.png

五款可运行Google Talk的iPhone应用

腾讯数码讯这篇文章最初刊登于《American Express OPEN Forum》上。那里定期会推出一些关于利用社交媒体或者在小型企业里的创新科技等文章。

在许多即时通软件纷纷败下阵来的今天,Google Talk却有着很多的支持者。这都要归功于普遍存在着的Gmail邮箱。在这里,我们选取了五款在iphone上可以运行Google Talk的应用软件。它们每一款都有自己的特色之处。

1. Beejive IM(完整版售价9.99美元,免费试用版只支持一个账户)

BeejiveIM号称是 iPhone上兼容性最强的MSN即时聊天客户端程序,兼容多种即时通讯协议,如Gtalk、ICQ、AIM、Gabber、iChat、Yahoo!、 MySpace等,支持横屏聊天,聊天记录保存等很多实用功能。

BeejiveIM可在多个同时聊天之间的快速切换。支持与AIM,雅虎,GTALK,或MSN上的多个哥们群聊。全面支持Unicode,在你的Android设备支持的任何语言聊天。支持横版。聊天记录:聊天记录保存聊天记录。超链接支持,自动解析网页,YouTube视频,电子邮件地址,Twitter的用户名和电话号码的链接。表情的支持。手机短信,通过AIM或雅虎短信与您的SMS哥们聊天。

2. eBuddy(免费)

eBuddy是一款im聚合工具。支持MSN,myspace,icq等众多聊天软件,界面华丽,使用方便,从此不用为手机上要装一堆聊天软件而烦恼。

3. IM +(普通版:免费;专业版:9.99美元)

IM+在我们推荐的五款app中拥有最好的用户界面,同时还有一些很值得称赞的功能。例如能够完整的储存聊天记录。而且,它与web浏览器是无缝集成的。

虽然免费版含有广告,但是你可以花3.99美元来移除它们。专业版完全无广告,同时还包含更多的功能。两个版本都能在iPad上使用,你可以通过iCloud进行同步。

4. Imo(免费)

Imo 的功能和推荐的其他的app基本一致,要附加说明的是它还能够发送简短的语音消息。

5. Verbs(0.99美元)

Verbs是一款非常灵活的聊天应用程序,它拥有的一些特性是我们在其他app上未曾见到的。它可以同步你iPhone上的Google Chat联系人,它允许你保存通过消息收到的链接地址,可以将你的聊天记录导出成为邮件,尽管这点对于Google Chat有点多余……

    本文来源:mashable.com

移植Linux内核2.6.32.2到QQ2440开发板

前一篇文章我们已将Linux-2.6.32.2的内核移植好了,当然了驱动我们还没有添加上去,今天我们先建立一个yaffs文件系统,待我们的内核能够挂载我们的文件系统以后,我们再去进一步的完善内核,这样,嵌入式linux系统就算是构建成功了。

1、 

 下载busybox

在home/kele888目录下建立rootfs文件夹,并把busybox压缩文件解压到home/kele888目录下我下载的是busybox-1.13.0的版本。

[root@localhost kele888]# ls

busybox-1.13.0 ....

[root@localhost kele888]#

2、 

 进入busybox目录开始编译

修改Makefile文件

# vim Makefile

164行 CROSS_COMPILE ?= arm-linux-

190行 ARCH ?= arm

保存推出

配置busybox

# make menuconfig(可以根据需要适当选择,改一下其他默认就行了)

BusyBox Settings --->

Build Options ---> (采用静态编译)

[*] Build BusyBox as a static binary (no shared libs)

Install optin-->

[*] Don't use /usr 

 //可以不选,选了则没有/usr文件夹

Busybox Library Tuning --->

(2) MD5: Trade Bytes for Speed

[*] Faster /proc scanning code (+100 bytes)

[*] Support for /etc/networks

[*] Command line editing

[*] Additional editing keys

[*] vi-style line editing commands

[*] History saving

[*] Tab completion

[*] Username completion

[*] Fancy shell prompts

Linux Module Utilities --->

[ ] Support version 2.2.x to 2.4.x Linux kernels

[*] Support version 2.6.x Linux kernels

Linux System Utilities --->

[*] Support for the old /etc/mtab file

Miscellaneous Utilities --->

[*] devfs(obsolete)

[*] Use devfs names for all device(obsolete)

Shell --->

Choose your default shell(ash)-->

---ash

编译安装busybox

make CONFIG_PREFIX=/home/kele888/rootfs install

注:编译“networking/interface.c”文件时可能会出现以下错误:

CC 

   networking/interface.o

networking/interface.c:818: error: 'ARPHRD_INFINIBAND' undeclared here (not in a function)

make[1]: *** [networking/interface.o] Error 1

make: *** [networking] Error 2

通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后修改“networking/interface.c”文件,在其中添加:

#define ARPHRD_INFINIBAND 32

完成以后将会在rootfs文件下生成如下的文件:

bin 

 linuxrc  sbin  usr

修改_install/bin/busybox 的属性。为+x

chmod +x ./_install/bin/busybox

必须要修改属性,否则在busybox 中很多命令会受限

然后在rootfs中建立其它目录

mkdir dev etc home lib mnt proc sys tmp root var

下面我们看一下由busybox生成以及自己mkdir的文件里面的一些内容(当然有些是不必要的):

“dev”目录

下面的内容在内核挂载完毕文件系统后,系统会使用mdev 自动建立。

不过mdev 是调用init 进程来启动的,在使用mdev 构建“dev”目录前,init 进程需要用到“/dev/console”和“/dev/null”这两个设备文件,所以,我们需要在制作文件系统时静态创建这两个设备文件,方法如下:

#mknod console c 5 1

#mknod null c 1 3

如果不创建这两个设备文件,在文件系统启动时会出现错误信息.大概是不能初始化控制台。

“etc”目录

用来存放系统的配置文件。

在“etc”目录下面有如下常用的文件:

fstab:指明需要挂载的文件系统;

group:用户组;

inittab:init 进程的配置文件;

passwd:密码文件;

profile:用户环境配置文件;

mdev.conf:因为2.6.18 版本开始linux 放弃使用devfs 而采用udev(mdev 是udev 的简化版本),这里的

mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我采用了为空;

resolv.conf:存放DNS 信息的文件,访问外网时需要DNS 的信息。

常用的目录有:

init.d 目录:启动文件目录,该目录下面有个“rcS”的文件,里面存放了系统启动时配置以及自启动加载

的进程等;

sysconfig 目录:在我们的文件系统里面,该目录下面存放了名为“HOSTNAME”的文件,该文件内容为:

Kele,这句话就是我们在文件系统里面看到那个“[root@ Kele/]” rc.d 目录:在我们的文件系统里面用来存放一些自启动所要调用的脚步等;

-----------------------/lib文件--------------------------------

/lib的库其实就是进行busybox编译的库,即交叉编译器的库,我们这里使用的是3.4.1(位置/usr/local/arm/3.4.1)。

# cd 

 /usr/local/arm/3.4.1/arm-linux/lib

# for file in libc libcrypt libdl libm libpthread libresolv libutil

> do

> cp $file-*.so 

 rootfs/lib (复制到你做的文件系统的/lib目录下)

> cp -d $file.so.[*0-9] 

 rootfs/lib

> done

# cp -d ld*.so* 

 rootfs/lib

-----------------系统配置文件的建立---------------------

--========/etc目录============

(1) fstab文件

# device 

    mount-point    type   options        dump  fsck order

proc 

          /proc        proc   defaults        0     0

tmpfs 

         /tmp         tmpfs  defaults        0     0

sysfs 

         /sys         sysfs  defaults        0     0

tmpfs 

         /dev         tmpfs  defaults        0     0

(2)inittab文件

# /etc/inittab

::sysinit:/etc/init.d/rcS

s3c2410_serial0::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

(3)创建/etc/init.d文件夹和rcS,在rcS中添加

#!/bin/sh

ifconfig eth0 192.168.1.17

mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

(4)host文件

Kele

(5)创建mdev.conf文件 (空文件)

(6)复制主机/etc/下面的文件passwd, group, shadow 文件到/etc

# cp /etc/group .

# cp /etc/passwd .

# cp /etc/shadow .

修改passwd中用户使用的shell名称。FC6上默认的为bash,而vivi只支持ash。

root:x:0:0:root:/root:/bin/bash -->root:x:0:0:root:/root:/bin/ash

(7)修改各文件和文件夹的权限

# chmod 755 /rootfs/etc/init.d/rcS

# chmod 755 /rootfs/etc/host

基于S3C2440嵌入式Linux系统下的一个DS18B20驱动

    用Linux驱动编程的方法写一个DS18B20的温度传感器驱动,从底层采集温度信息。以下乃本人所写的驱动和测试的源码,嵌入式Linux内核版本为2.6.29,硬件平台是友善之臂的QQ2440,DS18B20引脚连接S3C2440的GPIOB1,程序难免存在一定的漏洞,希望大家指出。

#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>

typedef unsigned char BYTE;

#define DS18B20_PIN   S3C2410_GPB1 #define DS18B20_PIN_OUTP S3C2410_GPB1_OUTP #define DS18B20_PIN_INP   S3C2410_GPB1_INP #define HIGH 1 #define LOW 0
#define DEV_NAME "DS18B20"
#define DEV_MAJOR 232

static BYTE data[2];

// DS18B20复位函数
BYTE DS18b20_reset (void)
{
   // 配置GPIOB0输出模式    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);       // 向18B20发送一个上升沿,并保持高电平状态约100微秒    s3c2410_gpio_setpin(DS18B20_PIN, HIGH);    udelay(100);       // 向18B20发送一个下降沿,并保持低电平状态约600微秒    s3c2410_gpio_setpin(DS18B20_PIN, LOW);    udelay(600);       // 向18B20发送一个上升沿,此时可释放DS18B20总线    s3c2410_gpio_setpin(DS18B20_PIN, HIGH);    udelay(100);    
    // 以上动作是给DS18B20一个复位脉冲    // 通过再次配置GPIOB1引脚成输入状态,可以检测到DS18B20是否复位成功    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);       // 若总线在释放后总线状态为高电平,则复位失败    if(s3c2410_gpio_getpin(DS18B20_PIN)){ printk("DS18b20 reset failed.rn"); return 1;}

    return 0; }

 

void DS18b20_write_byte (BYTE byte)
{
   BYTE i;    // 配置GPIOB1为输出模式    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);

    // 写“1”时隙:    //     保持总线在低电平1微秒到15微秒之间    //     然后再保持总线在高电平15微秒到60微秒之间    //     理想状态: 1微秒的低电平然后跳变再保持60微秒的高电平    //    // 写“0”时隙:    //     保持总线在低电平15微秒到60微秒之间    //     然后再保持总线在高电平1微秒到15微秒之间    //     理想状态: 60微秒的低电平然后跳变再保持1微秒的高电平    for (i = 0; i < 8; i++)    {        s3c2410_gpio_setpin(DS18B20_PIN, LOW); udelay(1);
       if(byte & HIGH)        {             // 若byte变量的D0位是1,则需向总线上写“1”             // 根据写“1”时隙规则,电平在此处翻转为高             s3c2410_gpio_setpin(DS18B20_PIN, HIGH);        }        else        {             // 若byte变量的D0位是0,则需向总线上写“0”             // 根据写“0”时隙规则,电平在保持为低             // s3c2410_gpio_setpin(DS18B20_PIN, LOW);        }        // 电平状态保持60微秒        udelay(60);

       s3c2410_gpio_setpin(DS18B20_PIN, HIGH);        udelay(15);       byte >>= 1;    }    s3c2410_gpio_setpin(DS18B20_PIN, HIGH); }

BYTE DS18b20_read_byte (void)
{
   BYTE i = 0;    BYTE byte = 0;    // 读“1”时隙:    //     若总线状态保持在低电平状态1微秒到15微秒之间    //     然后跳变到高电平状态且保持在15微秒到60微秒之间    //      就认为从DS18B20读到一个“1”信号    //     理想情况: 1微秒的低电平然后跳变再保持60微秒的高电平    //    // 读“0”时隙:    //     若总线状态保持在低电平状态15微秒到30微秒之间    //     然后跳变到高电平状态且保持在15微秒到60微秒之间    //     就认为从DS18B20读到一个“0”信号    //     理想情况: 15微秒的低电平然后跳变再保持46微秒的高电平    for (i = 0; i < 8; i++)    {        s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);        s3c2410_gpio_setpin(DS18B20_PIN, LOW);

       udelay(1);        byte >>= 1;       s3c2410_gpio_setpin(DS18B20_PIN, HIGH);        s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);       // 若总线在我们设它为低电平之后若1微秒之内变为高        // 则认为从DS18B20处收到一个“1”信号        // 因此把byte的D7为置“1”        if (s3c2410_gpio_getpin(DS18B20_PIN)) byte |= 0x80;        udelay(60);    }    return byte;       }

void DS18b20_proc(void)         {    while(DS18b20_reset());       udelay(120);       DS18b20_write_byte(0xcc);    DS18b20_write_byte(0x44);       udelay(5);       while(DS18b20_reset());    udelay(200);       DS18b20_write_byte(0xcc);    DS18b20_write_byte(0xbe);       data[0] = DS18b20_read_byte();    data[1] = DS18b20_read_byte(); }

static ssize_t s3c2440_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
   DS18b20_proc();

    buf[0] = data[0];    buf[1] = data[1];       return 1; }

static struct file_operations s3c2440_18b20_fops =
{
   .owner = THIS_MODULE,    .read = s3c2440_18b20_read, };

static int __init s3c2440_18b20_init(void)
{
   if (register_chrdev(DEV_MAJOR, DEV_NAME, &s3c2440_18b20_fops) < 0)    {        printk(DEV_NAME ": Register major failed.rn");        return -1;    }       devfs_mk_cdev(MKDEV(DEV_MAJOR, 0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEV_NAME);        while(DS18b20_reset());   }

static void __exit s3c2440_18b20_exit(void)
{
   devfs_remove(DEV_NAME);    unregister_chrdev(DEV_MAJOR, DEV_NAME); }

module_init(s3c2440_18b20_init);
module_exit(s3c2440_18b20_exit);

 

 

 

 

 

#include "stdio.h"
#include "sys/types.h"
#include "sys/ioctl.h"
#include "stdlib.h"
#include "termios.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "sys/time.h"

main()
{
   int fd;    unsigned char buf[2];    float result;

    if ((fd=open("/dev/DS18B20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0)    {        printf("Open Device DS18B20 failed.rn");        exit(1);    }    else    {        printf("Open Device DS18B20 successed.rn");        while(1)        {            read(fd, buf, 1);            result = (float)buf[0];            result /= 16;            result += ((float)buf[1] * 16);                 printf("%.1f `Crn", result);            sleep(1);        }        close(fd);    } }

 

 

 

 

obj-m := s3c2440_ds18b20.o

KERNELDIR ?= ../../kernel/linux-2.6.29
PWD := $(shell pwd)
CC := arm-linux-gcc
CLEAN := rm -rf

all : s3c2440_ds18b20.c test_ds18b20
   $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

test_ds18b20 : test_ds18b20.c
   $(CC) test_ds18b20.c -o test_ds18b20

clobber :
   $(CLEAN) test_ds18b20 s3c2440_ds18b20.ko clean :    $(CLEAN) *.mod.* *.o *~ modules.order Module.symvers

 

    这个驱动是基于Linux的2.6.29内核树编译的,内核树的路径是当前目录的../../kernel/linux-2.6.29,若以来其他的Linux的内核树,编译时可能会出现找不到某些文件的情况,如hardware.h等,只需要在内核树中作一些软链接就可以解决,还有声明一点的就是:Makefile中的命令操作前的并非空格,而是TAB跳格。

    make编译,编译完毕后产生许多文件,我们只关心test_ds18b20和s3c2440_ds18b20.ko这两个。

    把以上两个文件下载到开发板中,创建一个设备节点:

    mknod /dev/DS18B20 c 232 0

    把s3c2440_ds18b20这个模块加载到内核:

    insmod s3c2440_ds18b20.ko

    加载成功后我们可以通过模块列表查看:

 

之后把test_ds18b20测试文件改为可执行状态:

   chmod 0111 test_ds18b20   执行后可以观察到以下的结果:

[转载]基于S3C2440嵌入式Linux系统下的一个DS18B20驱动和命

 

原文地址:基于S3C2440嵌入式Linux系统下的一个DS18B20驱动和命作者:李焕东

裁减、配置和移植Linux内核到s3c2440开发板

一、准备工作(使用tar xjvf命令解压linux-2.6.22.6.tar.bz2后,cd /work/system/linux-2.6.22.6)1、修改顶层Makefile的185和186行,以指定特定CPU体系结构和交叉编译工具。

185 ARCH 

           ?= arm

186 CROSS_COMPILE 

  ?= arm-linux-

2、内核配置选项有几百个,配置者不可能一一配置,因此先输入make s3c2410_defconfig,以使用标准模板的配置

dennis@dennis-desktop:/work/system/linux-2.6.22.6$ make s3c2410_defconfig

3、使用make menuconfig进入图形配置界面,浏览基本配置

image

单击System Type ---- S3C2440 Machines

image

SMDK2440和SMDK2440 with S3C2440 CPU module已被选择(方括弧内有*号),表明编译出来的内核将支持由S3C2440组成的开发板

4、保存退出后,输入make zImage,大约半小时后将在arch/arm/boot目录生成内核文件zImage

5、将制作uImage的程序mkimage(位于编译后的u-boot源代码目录的tools子目录中)拷贝到/usr/bin目录

sudo 

    cp     /work/system/u-boot-1.1.6/tools/mkimage     /usr/bin/

6、输入make uImage后,内核构造系统将调用mkimage,通过zImage生成uImage(位于arch/arm/boot目录)。uImage是可供u-boot引导的linux内核,它在zImage前增加了64byte的头(这64byte的头有什么作用、里面包含什么内容,请参见“深入剖析u-boot”一文)

dennis@dennis-desktop:/work/system/linux-2.6.22.6$ ls -l arch/arm/boot/[uz]Image
-rw-r--r-- 1 dennis dennis 1511140 2010-04-01 10:43 arch/arm/boot/uImage
-rwxr-xr-x 1 dennis dennis 1511076 2010-04-01 10:41 arch/arm/boot/zImage

7、将uImage烧写到开发板的nand flash上

1)、使用网线将开发板与Linux机器物理连通

2)、配置Linux机器的ip地址为192.168.2.11

3)、配置开发板的ip地址为192.168.2.17

Dennis Yang > setenv ipaddr 192.168.2.17
Dennis Yang > saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done

4)、确认开发板能与Linux机器通信

Dennis Yang > ping 192.168.2.11
host 192.168.2.11 is alive

5)、配置Linux机器上NFS服务器的配置文件/etc/exports,使NFS服务器共享/work/system/linux-2.6.22.6目录

/work/system/linux-2.6.22.6 

         *(rw,sync,no_root_squash)

后,重启NFS服务

sudo 

   /etc/init.d/nfs-kernel-server     restart

6)、将uImage下载到开发板RAM地址0x32000000处

Dennis Yang > nfs 0x32000000 192.168.2.11:/work/system/linux-2.6.22.6/arch/arm/boot/uImage

7)格式化nand flash某区段(起始地址为0x80000,长度为0x180000字节),并将位于RAM地址0x32000000的uImage烧写到该区段

Dennis Yang > nand erase 0x80000 0x180000

Dennis Yang > nand write.jffs2 0x32000000 0x80000 0x180000

8)、启动Linux。可以看到内核正确并被启动,但旋即输出乱码。这说明需要对Linux进行移植(修改源代码)

Dennis Yang > boot

NAND read: device 0 offset 0x80000, size 0x180000

Reading data from 0x1ffe00 -- 100% complete.
1572864 bytes read: OK
## Booting image at 32000000 ...

  Image Name:   Linux-2.6.22.6   Created:      2010-04-01   2:43:59 UTC   Image Type:   ARM Linux Kernel Image (uncompressed)   Data Size:    1511076 Bytes =  1.4 MB   Load Address: 30008000   Entry Point:  30008000   Verifying Checksum ... OK OK

Starting kernel ...

Uncompressing Linux................................................................................................... done, booting the kernel.
鯸竾"骾7记浄77 悄3:癖;?虡?蘬儳{€$剜#"8€4梧f凣郻凣?f癎C?吾G4鞇`[

二、为S3C2440移植内核

1、修改晶振频率

S3C2440支持2种晶振频率:12MHZ和16MHZ。qq2440v3开发板使用的是12M的晶振,而内核源代码则采用的是16M频率,从而产生了错误的PCLK,因此导致内核向串口输出数据时使用了错误的波特率(正确的应是115200),这样在超级终端中看到的就是乱码。因此我们只需修改内核源代码中的晶振频率即可。

将arch/arm/mach-s3c2440/mach-smdk2440.c的第180行

s3c24xx_init_clocks(16934400);

改为:

s3c24xx_init_clocks(12000000);

2、修改nand flash分区表

这次内核正常启动,不再出现乱码,但未能成功挂载根文件系统。出现错误如下:

VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 132K
Warning: unable to open an initial console.
Kernel panic - not syncing: No init found. 

 Try passing init= option to kernel.

仔细查看内核出错前的输出,发现内核在nand flash上创建了8个分区:

Creating 8 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00004000 : "Boot Agent"
0x00000000-0x00200000 : "S3C2410 flash partition 1"
0x00400000-0x00800000 : "S3C2410 flash partition 2"
0x00800000-0x00a00000 : "S3C2410 flash partition 3"
0x00a00000-0x00e00000 : "S3C2410 flash partition 4"
0x00e00000-0x01800000 : "S3C2410 flash partition 5"
0x01800000-0x03000000 : "S3C2410 flash partition 6"
0x03000000-0x04000000 : "S3C2410 flash partition 7"

而内核从u-boot获得的启动参数(root=/dev/mtdblock2)表明,根文件系统放在nand flash的第3个分区上。

Kernel command line: noinitrd root=/dev/mtdblock2 console=ttySAC0 rootfstype=jffs2

这样一来,内核会到nand flash的0x00400000-0x00800000区间来挂载根文件系统,但事实上我们通过u-boot烧写根文件系统时,是将其烧写在nand flash的0x1200000-0x2200000这个区间的。所以内核不能成功挂载根文件系统。因此,我们必须修改内核对nand flash的分区定义,让第3个分区位于0x1200000-0x2200000这个区间。

修改arch/arm/plat-s3c24xx/common-smdk.c文件,将109-150行改为:

static struct mtd_partition smdk_default_nand_part[] = {

       [0] = {                .name   = "Kernel",                .size   = SZ_2M,                .offset = 0,        },        [1] = {                .name   = "YaffsRoot",                .offset = MTDPART_OFS_APPEND,                .size   = SZ_16M,        },        [2] = {                .name   = "Jffs2Root",                .offset = MTDPART_OFS_APPEND,                .size   = SZ_16M,        },        [3] = {                .name   = "FreePartition",                .offset = MTDPART_OFS_APPEND,                .size   = MTDPART_SIZ_FULL,        } };

三、配置并裁减内核

现在内核虽然可以正常工作,但作为嵌入式操作系统的Linux,是可以被裁减以适应我们的具体需要。下面我们就通过 make menuconfig 对内核进行配置和裁减,使得最终的内核尽量小,并实现支持:

1、nand flash驱动;2、jffs2文件系统 ;3、ELF格式的应用程序;4、串口驱动;5、ram disk(将内存当硬盘使用);6、ext2文件系统;7、环回设备(将物理文件

当硬盘使用、类似windows下的虚拟光驱);8、将目录挂载到内存(将内存当目录使用);9、能识别U盘FAT分区和NTFS分区上的中英文文件;10、更新和获取实时时钟;

11、watchdog驱动;12、I2C驱动;13、SPI驱动;14、framebuffer;

15、TCP/IP协议栈;16、开发板充当NFS客户端;17、将NFS服务器上的共享目录挂载为根文件系统;18、动态加载和卸载模块;19、开发板充当PC机的U盘;20、USB网卡DM9601

不支持:1、网卡驱动;2、声卡驱动

image

Code maturity level options 选中则使未定型的功能组件出现在配置选项中,这样就可以显示更多的配置选项
General setup 杂项设置
Block layer 块设备层:用于设置块设备的一些总体参数,比如是否支持大于2TB的块设备、是否支持大于2TB的文件、设置I/O调度器等。一般使用默认值即可
System Type 系统类型:选择CPU架构、开发板类型等开发板相关的配置选项
Bus support PCMCIA/CardBus总线的支持,不用设置
Kernel Features 用于设置内核的一些参数,比如是否支持内核抢占,是否支持动态修改系统时钟等
Boot options 启动参数:比如设置默认的命令行参数等,一般不用理会
Floating point emuulation 浮点运算仿真功能,目前linux还不支持硬件浮点运算,所以要选择一个浮点仿真器,一般选择“NWFPE math emulation”
Userspace binary formats 可执行文件格式,一般选择ELF
Power management options 电源管理选项
Neteworking 网络协议选项:一般都选择“Networking support”以支持网络功能,选择“Packet socket”,以支持raw socket接口功能,选择“TCP/IP networking”以支持TCP/IP网络协议。通常在选择“Networking support”后使用默认配置
Device Drivers 设备驱动程序:几乎包含Linux的所有驱动程序
File systems 文件系统
profiling support 对系统的活动进行分析,仅供内核开发者使用
Kernel hacking 调试内核时的各种选项
Security options 安全选项,一般使用默认选项
Cryptographic options 加密选项
Library routines 库子程序:比如CRC32检验函数、zlib压缩函数等。不包含在内核源码中的第三方内核模块可能需要这些库,可以全不选,若内核中其它部分依赖它,会自动选上