嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第五天-kernel配置(物联技术666)

链接:https://pan.baidu.com/s/1eb94AaDM-cIZsbr929Isbw?pwd=1688
提取码:1688

上午:linux内核介绍                徐登伟老师

下午:linux的配置

教学内容:

一、基本kernel的制作:

1、去开源社区下载原版kernel,linux-2.6.34.tar.bz2

2.  解压linux-2.6.34.tar.bz2源码包

  tar jxvf linux-2.6.34.tar.bz2  -C  /home/

3.  修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改

     ARCH ? =arm                       //指定是arch/arm

     CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux- //指定编译器是目录下的交叉编译

注意:交叉编译器的环境变量也需要改为arm-linux-gcc-4.3.2

    #export PATH=/usr/local/arm/4.3.2/bin/:$PATH    //加入临时环境变量

4.  修改平台输入时钟

修改平台的时钟频率,修改内核源码“arch/arm/mach-s3c2440/mach-smdk2440.c”

把时钟初始化中(S3C24XX_init_clocks(16934400 ))的16934400 改为12000000,因为我们的开发板上为12M

5.  修改机器类型ID号(一般可以不修改,主要是要在vivi分表的时候和这里保持一致)

   bootloader启动内核时,会传递机器类型ID进来,这里需根据bootloadr传进的ID修改内核ID号

   在内核源码的“arch/arm/tools/mach-types”文件查找S3C2440,这里刚好与我们的bootloader相同,所以不用做修改,直接保存退出即可,如果不同则根据bootloader的内容修改此文件,或根据此文件修改boorloader的内容(在vivi中可通过param show查看)。

6.  解压yaffs_patch.tar.bz2源码包,进入yaffs2文件夹,给内核打上补丁使内核支持yaffs2

   # ./ patch-ker.sh  c  /home/linux-2.6.34

7.  修改内核mtd分区和bootloader(vivi)使其一致(这步主要是为vivi服务)

编辑文件arch/arm/plat-s3c24xx/common-smdk.c(同样和vivi分表一致)

static struct mtd_partition smdk_default_nand_part[] =

 {

        [0] = {

                .name      = "vivi",          //命令名字

                .size = 0x00030000,        //大小     

                .offset      = 0,                  //开始位置

        },

        [1] = {

                .name      = "kernel",

                .offset = 0x00050000,

                .size = 0x00300000,

        },

        [2] = {

                .name      = "rootfs",

                .offset = 0x00350000,

                .size = 0x03cac000,

        }

};

8.  修改文件drivers/mtd/nand/s3c2410.c

将s3c2410_nand_init_chip函数里的NAND_ECC_SOFT(switch  case后面的不用改)改为NAND_ECC_NONE(因为在内核中默认配置不支持ECC校验,当然也可以在内核配置时选中ECC选项)

9.  到llinux-2.6.30目录下执行命令

   #cp  arch/arm/configs/s3c2410_defconfig  .config

10.   执行make menuconfig,并对选项进行配置

1)System Type --->

        S3C2440 and S3C2442 machines --->

仅保留SMDK2440 与SMDK2440 whith S3C2440 CPU module两个选项,将其他的选项全部勾掉

2)Kernel Features --->

        [*]Use the arm EABI to compile the kernel(选中该选项)

3)File systems --->

        a、把与ext2 ext3 ext4相关的所有选项全部去掉

        b、Miscellaneous filesystems --->

                <*>YAFFS2 file system support(选中此选项)

去除所有与jffs2相关的选项

保存退出

11、make zImage,在arch/arm/boot下生成编译好的可执行程序

    或make uImage,在arch/arm/boot下生成编译好的可执行程序

二、带设备驱动的kernel

开始先重复上面的1-10步:

1dm9000网卡驱动的移植:

1)修改arch/arm/plat-s3c24xx/devs.c 文件,增加以下代码:

/****add by dengwei*********************************/

#include <linux/dm9000.h>

static struct resource s3c_dm9k_resource[] =

{

     [0] =

      {

             .start = S3C2410_CS3,               //网卡连接在CS3总线上

             .end = S3C2410_CS3 + 3,

             .flags = IORESOURCE_MEM,

     },

     [1] =

     {

             .start = S3C2410_CS3 + 4,

             .end = S3C2410_CS3 + 4 + 3,

             .flags = IORESOURCE_MEM,

     },

     [2] = {

     .start = IRQ_EINT7,

     .end = IRQ_EINT7,

     .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,

     }

};

static struct dm9000_plat_data s3c_dm9k_platdata =

{

       .flags = DM9000_PLATF_16BITONLY,

};

struct platform_device s3c_device_dm9k =

{

     .name = "dm9000",

     .id = 0,

     .num_resources = ARRAY_SIZE(s3c_dm9k_resource),

     .resource = s3c_dm9k_resource,

     .dev =

     {

         .platform_data = &s3c_dm9k_platdata,

     }

};

EXPORT_SYMBOL(s3c_device_dm9k);

/*************************add bu dengwei***************************/

2)修改 arch/arm/mach-s3c2440/mach-smdk2440.c文件

        修改struct platform_device *smdk2440_devices[] __initdata结构体增加以下代码:

        static struct platform_device *smdk2440_devices[] __initdata =

        {

       &s3c_device_ohci,

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c0,

       &s3c_device_iis,

       &s3c_device_dm9k,               //for dm9000   add by dengwei

        };

        3)修改以下文件 arch/arm/plat-s3c24xx/include/plat/s3c244x.h

                extern struct platform_device s3c_device_dm9k;  // add by dengwei

        4)修改drivers/net/dm9000.c源码:

    在头文件区增加头文件:

#include  <mach/regs-mem.h>

        大约1365行左右增加以下代码:

        static int __devinit dm9000_probe(struct platform_device *pdev)

{

        //add   here

}

        注意:添加在dm9000_probe函数的开头

        /**********add by dengwei******************************************/

       #if  defined(CONFIG_ARCH_S3C2440)

        int oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);

*((volatile unsigned int *)S3C2410_BWSCON)=(oldval_bwscon&~(3<<16))| S3C2410_BWSCON_DW3_16|S3C2410_BWSCON_WS3|S3C2410_BWSCON_ST3; //设置BANK3:总线宽度为16,使能nWAIT

    *((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c;     //设置BANK3的时间参数

#endif

/**********add by dengwei*************************************************/

        5)修改make menuconfig配置选项:

                Devices   Drivers --->

                        Network device support --->

                              Ethernet (10 or 100) --->

                                        [*]DM9000 support

                                        (4)DM9000 maxinum        debug level    

//仅保留这两个选项,其余的全部去掉

         

        6)重新编译内核,烧入开发板中即可

        7)第一次使用的开发板需使用 ifconfig eth0 hw ether 12:34:56:78:32:65 设置mac地址

    (MAC地址可以随便设置)

          使用ifconfig eth0 192.168.220.*设置开发板IP

          使用ping命令ping主机即可

2、USB驱动(U盘支持)

        配置内核对USB设备的支持,2.6.34内核中对USB设备的支持已经非常全面了

        这里只需要按照以下配置  就可以了,配置完后重新编译内核烧到开发板上

        1)、修改make menuconfig

        SCSI device support --->

        < > RAID Transport Class

        <*> SCSI device support

        < > SCSI target support

        [*] legacy /proc/scsi/ support

        *** SCSI support type (disk, tape, CD-ROM) ***

        <*> SCSI disk support

        < > SCSI tape support

        < > SCSI OnStream SC-x0 tape support

        < > SCSI CDROM support

        <*> SCSI generic support

        < > SCSI media changer support

    [*] HID Devices --->

        --- HID Devices

        -*- Generic HID support

        [ ] /dev/hidraw raw HID device support

        *** USB Input Devices ***

        <*> USB Human Interface Device (full HID) support

        [ ] PID device support

        [*] /dev/hiddev raw HID device support

    [*] USB support --->

        {*} Support for Host-side USB

        [ ] USB verbose debug messages

        [ ] USB announce new devices

        *** Miscellaneous USB options ***

        [*] USB device filesystem

        [*] USB device class-devices (DEPRECATED)

        <*> OHCI HCD support

        <*> USB Mass Storage support

        2)、插入U盘。

        当系统启动后插入U盘就会出现一些信息,可以看到sda就是U盘设备了,sda1是U盘的一个分区。

         mount  /dev/sda1  /mnt/ -o utf8

         utf8 参数可以识别中文

3、LCD

1)、修改 arch/arm/mach-s3c2440/mach-smdk2440.c 如下:

/* LCD driver info */

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

        .lcdcon5  = S3C2410_LCDCON5_FRM565 |

        //                S3C2410_LCDCON5_INVVLINE |

        //                S3C2410_LCDCON5_INVVFRAME |

                          S3C2410_LCDCON5_PWREN |

                          S3C2410_LCDCON5_HWSWP,

        .type        = S3C2410_LCDCON1_TFT,

        .width              = 320,

        .height             = 240,

        .pixclock = 64000,                 /* HCLK 60 MHz, divisor 10 */

        .xres        = 320,

        .yres        = 240,

        .bpp                 = 16,

        .left_margin    = 18,

        .right_margin  = 38,

        .hsync_len       = 30,

        .upper_margin = 18,

        .lower_margin = 18,

        .vsync_len       = 3,

};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {

        .displays  = &smdk2440_lcd_cfg,

        .num_displays = 1,

        .default_display = 0,

#if 0

        /* currently setup by downloader */

        .gpccon           = 0xaa940659,

        .gpccon_mask = 0xffffffff,

        .gpcup             = 0x0000ffff,

        .gpcup_mask   = 0xffffffff,

        .gpdcon           = 0xaa84aaa0,

        .gpdcon_mask = 0xffffffff,

        .gpdup             = 0x0000faff,

        .gpdup_mask   = 0xffffffff,

#endif

        .gpccon =       0xaa955699,      //这是将GPC和GPD设置成功能引脚,也可以不设置

        .gpccon_mask =  0xffc003cc,

        .gpcup             = 0x0000ffff,

        .gpcup_mask   = 0xffffffff,

        .gpdcon =       0xaa95aaa1,

        .gpdcon_mask =  0xffc0fff0,

        .gpdup             = 0x0000faff,

        .gpdup_mask   = 0xffffffff,

       

        //.lpcsel           = ((0xCE6) & ~7) | 1<<4,

        .lpcsel              = 0xf82,  //设置TCONSEL寄存器选择三星240x320

};

static struct platform_device *smdk2440_devices[] __initdata = {

        &s3c_device_ohci,

        &s3c_device_lcd,                   //检查这里有没有加上

        &s3c_device_wdt,

        &s3c_device_i2c0,

        &s3c_device_iis,

        &s3c_device_dm9k,               //for dm9000 add by xiuhai.deng

};

a、如果要让系统启动起来看到 bootlogo 小企鹅,必须得在 make menuconfig 中进行配置添加

     在 Device Drivers ---> Graphics support ---> Bootup logo下面可以全部选中支持

b、打开gimp号称 linux 下的 photoshop ,安装windows版(gimp-2.6.9-i686-setup.exe)

     打开任何格式的一张将要转换的图片

     选择:图像--->模式--->索引颜色转换--->最大颜色数量设置为(244)--->转换

     还可以通过:图像--->缩放图像--->设置想要的图像大小

     最后:文件--->另存为--->选择ppm格式--->保存格式为 ASCII

c、将转换好的图片拷贝到 drivers\video\logo 替换 logo_linux_clut224.ppm

     并删除 logo_linux_clut224.c和logo_linux_clut224.o重新make zImage

d、且对于大多系统bootlogo图片的大小可以随便,且无需改动源码就可以显示

e、去掉10分钟后自动关屏问题:

    在有一个 drivers/char/vt.c 文件其中有一个变量(blankinterval)可以设置它

    来修改自动关屏的时间,也可以在函数(blank_screen_t)开头直接返回,这

    样就永远不会关屏了

4、触模屏

1)、将 drivers/input/touchscreen/s3c2410_ts.c 换掉(在课件文件夹内)

2)、make menuconfig

      Device Driver -->

             Input device support -->

                Touchscreens -->

                    [*]Samsung S3C2410 touchscreen input driver (它对应s3c2410_ts.c驱动) 

5、UDA1341声卡驱动

1)、make menuconfig 声卡的配置是:

Device Drivers

      <*>Sound card support

       <*>Advanced Linux Sound Architecture  --->(除这项外,其它全部不选中)

             <*>Advanced Linux Sound Architecture (除了以下选项,其它均不选中)

             <*>   OSS Mixer API

             <*>   OSS PCM (digital audio) API

             [*]     OSS PCM (digital audio) API - Include plugin system

             [*]   Verbose procfs contents

                           <*>ALSA for Soc audio support(只选择下面两项)

                                <*>SoC Audio for the Samsung S3C24XX chips

                              <*>SoC I2S Audio support UDA134X wired to a S3C24XX

2)、配置声卡驱动

下面是我在mach-smdk2440.c上修改的地方:

#include <sound/s3c24xx_uda134x.h>

static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data =

{

       .l3_clk = S3C2410_GPG(10),  //这三个引脚是跟据自己开发板的硬件连接决定的

       .l3_data = S3C2410_GPG(9),

       .l3_mode = S3C2410_GPG(11),

       .model = UDA134X_UDA1341,

};

static struct platform_device s3c24xx_uda134x =

{

       .name = "s3c24xx_uda134x",

       .dev =

{

              .platform_data    = &s3c24xx_uda134x_data,

       }

};

static struct platform_device *smdk2440_devices[] __initdata =

{

       &s3c_device_usb,

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c0,

       &s3c_device_iis,

       &s3c_device_rtc,

       &s3c24xx_uda134x,

};

3)、编译、下载

在内核目录下make zImage后将生成的内核文件烧写到开发板。

4)、测试

启动开发板后将已经拷贝歌曲的U盘插入到开发板的USB接口,挂载U盘后,运行”cat  01.mp3 > /dev/dsp”命令后听到音频耳机输出哧哧的声音,证明声卡驱动配置成功。

6、mmc/SD card driver

1)、arch/arm/mach-s3c2440/mach-smdk2440.c platform结构中增加&s3c_device_sdi语句。

static struct platform_device *smdk2440_devices[] __initdata =

 {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c,

&s3c_device_iis,

&s3c_device_nand,

&s3c_device_sdi,           //add here

};

     在make menuconfig时选上所有关于sd卡的信息,要想支持中文还得选上:

Device Drivers --->

    <*> MMC/SD/SDIO card support --->

        --- MMC/SD/SDIO card support

        [ ] MMC debugging

        [ ] Allow unsafe resume (DANGEROUS)

        *** MMC/SD/SDIO Card Drivers ***

        <*> MMC block device driver

        [*] Use bounce buffer for simple hosts

        < > SDIO UART/GPS class support

        < > MMC host test driver

        *** MMC/SD/SDIO Host Controller Drivers ***

        < > Secure Digital Host Controller Interface support

        < > MMC/SD/SDIO over SPI

        <*> Samsung S3C SD/MMC Card Interface support

      File system--》

            DOS/FAT/NT Filesystems--》

                       VFAT(Windows-95)fs support

               (437)Default codepage for FAT

               **把437改为936

            Native language support -->

                 [*]Simplified Chinese charset

                 [*]NLS UTF-8

        这样就可直接挂载了 mount -t vfat /dev/mmcblk0 /mnt

        如果sd卡分区了 mount -t vfat /dev/mmcblk0p1 /mnt

        直接读写sd就可以了

2)、爱普板子SD卡少接两根引脚,分别是检测SD卡插拔的中断引脚和SD卡写保护的引脚

所以插上SD卡后要重启才能起作用

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值