嵌入式培训机构四个月实训课程笔记(完整版)-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步:
1、dm9000网卡驱动的移植:
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卡后要重启才能起作用