Linux内核移植
-
环境
-
开发板
Tiny6410 NAND:2G RAM:256M MLC
-
操作系统
Fedora10
-
交叉编译器
arm-linux-gcc-4.5.1(linux自带)
-
内核版本
Linux-2.6.38
-
准备
配置交叉编译器
-
下载内核
www.kernel.org
-
解压内核
#tar -jxvf linux-2.6.38.tar.bz2 -C 路径
-
NAND Flash移植
-
修改根下的Makefile
#vim Makefile
将约191行修改为:
ARCH ?=(空格)arm
CROSS_COMPILE ?= arm-linux-
-
执行下面命令生成默认配置文件
# cp arch/arm/configs/s3c6400_defconfig .config
如省略这个操作的话,后面会找不到System Type
-
运行配置菜单,做基本配置
#make menuconfig
Generalsetup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix
上面的设置可以通过修改内核根下的Makefiel中的如下行实现:
CROSS_COMPILE ?= arm-linux-
然后再选择如下项目:
SystemType --->
ARM systemtype (ARM Ltd. Versatile family) --->
( X)Samsung S3C64XX
返回上述菜单后,选择:
System Type->[*] MINI6410
上面这个选项,首先选上,其他的可以去掉,不确定的可以参考友善之臂的
-
拷贝友善配套光盘的NAND Flash驱动
drivers/mtd/nand/s3c_nand.c
arch/arm/plat-samsung/include/plat/regs-nand.h
drivers/mtd/nand/s3c_nand_mlc.fo
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/Makefile
-
再次配置nand驱动
#make menuconfig
做如下选择
Device Drivers--->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
[*] Command line partition table parsing
<*> Direct char device access to MTD devices
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
<> NAND Flash supportfor Samsung S3C SoCs
<*> NAND Flash support for S3C SoC
[*] S3C NAND Hardware ECC
上面红色的不配置,UBIFS配置将无效!
-
执行编译
#make
成功后后面几行出下如下内容
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage 内核就是这个
Kernel: arch/arm/boot/zImage is ready
Building modules, stage 2.
MODPOST 16 modules
-
UBIFS驱动移植
-
配置内核支持UBIFS
DeviceDrivers --->
Memory TechnologyDevice (MTD) support --->
UBI - Unsortedblock images --->
Enable UBI
-
配置MTD支持UBI接口
File systems --->
Miscellaneous filesystems --->
UBIFS filesystem support
-
#make
-
下载测试
UBIFS: recovery needed
UBIFS: recovery completed
UBIFS: mounted UBI device0, volume 0, name "FriendlyARM-root"
UBIFS: file systemsize: 2066448384 bytes (2018016 KiB,1970 MiB, 2002 LEBs)
UBIFS: journal size: 12517376 bytes (12224 KiB, 11 MiB, 13LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor:lzo
UBIFS: reserved forroot: 0 bytes (0 KiB)
成功后出现以上内容。
-
网卡(DM9000)移植
-
修改DM9000网卡头文件
#vi include/linux/dm9000.h
28行增加
unsigned char param_addr[6];
-
修改驱动文件
#vi drivers/net/dm9000.c
大概1586行增加
if (!is_valid_ether_addr(ndev->dev_addr)&& pdata != NULL) {
mac_src = "param data";
memcpy(ndev->dev_addr,pdata->param_addr, 6);
}
-
配置内核
#make menuconfig
[*] Networking support --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
[ ] Ethernet (1000 Mbit) ---> 去掉
-
Make编译
#make
-
LCD移植
-
修改文件vi arch/arm/plat-samsung/include/plat/map-base.h
#vi arch/arm/plat-samsung/include/plat/map-base.h
第39行增加如下代码:
#define S3C_VA_LCD S3C_ADDR(0x01100000) /* LCD */
-
复制友善原内核中的arch/arm/mach-s3c64xx/include/mach/regs-lcd.h
#cp ../linux-2.6.38/arch/arm/mach-s3c64xx/include/mach/regs-lcd.h arch/arm/mach-s3c64xx/include/mach/regs-lcd.h
-
将友善原内核的drivers/video/samsung整个文件夹拷贝过来
#cp -arf ../linux-2.6.38/drivers/video/samsung drivers/video/samsung
-
修改文件drivers/video/Kconfig
第2068行增加source "drivers/video/samsung/Kconfig"
#vi drivers/video/Kconfig
-
修改文件vi drivers/video/Makefile
#vi drivers/video/Makefile
120行增加
obj-$(CONFIG_FB_S3C_EXT) += samsung/
-
修改文件vi arch/arm/mach-s3c64xx/mach-mini6410.c
#vi arch/arm/mach-s3c64xx/mach-mini6410.c
48行增加
#include <linux/delay.h>
136行mini6410_lcd_power_set函数里的内容改成
if (power) {
gpio_direction_output(S3C64XX_GPF(13), 1); //GPF13是USBpower用的,与lcd无关
gpio_direction_output(S3C64XX_GPF(15), 1); //GPF15是是真正的一线控制线连PWM1
/* fire nRESET on power up */
gpio_direction_output(S3C64XX_GPN(5), 0); //GPN5好像与lcd也无关,先copy吧
msleep(10);
gpio_direction_output(S3C64XX_GPN(5), 1);
msleep(1);
} else {
gpio_direction_output(S3C64XX_GPF(15), 0);
gpio_direction_output(S3C64XX_GPF(13), 0);
}
183行:????编译出现错误!!!
default_bpp = 16,},
的后面增加结构体:
staticstruct map_desc mini6410_lcd_iodesc[] = {
{
/* LCD support */
.virtual = (unsigned long)S3C_VA_LCD,
.pfn = __phys_to_pfn(S3C_PA_FB),
.length = SZ_16K,
.type = MT_DEVICE,
},
};
将mini6410_map_io()这个函数中的一个函数引用改成如下。
s3c64xx_init_io(mini6410_lcd_iodesc,ARRAY_SIZE(mini6410_lcd_iodesc));
437行增加
gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
去掉
gpio_request(S3C64XX_GPE(0), "LCD power");
-
配置内核
#make menuconfig
Powermanagement options --->
[ ] Power Management support
DeviceDrivers --->
Graphics support --->
<*> Support for frame buffer devices --->
< > Samsung S3C framebuffer support
<*> S3C Framebuffer Support (eXtended)
Select LCD Type (4.3 inch 480x272 TFT LCD) --->
<*> Advanced optionsfor S3C Framebuffer
Select BPP(Bits PerPixel) (16 BPP) --->
(4) Number ofFramebuffers
[ ] Enable Virtual Screen(NEW)
[*] Enable DoubleBuffering
[ ] Backlight & LCD devicesupport --->
Console display driver support --->
<*> Framebuffer Console support
[*] Bootup logo --->
[ ] Standard black and white Linux logo
[ ] Standard 16-color Linux logo
[*] Standard 224-color Linux logo
-
上面第一个绿色行一定要去掉,不然会有:drivers/video/samsung/s3cfb_fimd4x.c:1440:2:error: implicit declaration of function s3c6410_pm_do_save'的错误,郁闷了半天
-
上面第二个绿色行也一定要选,不然会有drivers/built-in.o:(.data+0x174):undefined reference to `soft_cursor'的错误。
-
重新编译内核并测试
#make
下载内核,如果屏幕出现小企鹅,说明LCD移植成功!
需要和触摸屏一起做才亮!
-
触摸屏移植
-
触摸屏驱动移植
从友善的配套内核中复制一下文件到新内核的对应文件夹:
arch/arm/mach-s3c64xx/dev-ts-mini6410.c
arch/arm/mach-s3c64xx/include/mach/ts.h
arch/arm/plat-samsung/include/plat/regs-adc.h //覆盖
drivers/input/touchscreen/mini6410_1wire_host.c
drivers/input/touchscreen/mini6410-ts.c
drivers/input/touchscreen/ts-if.c
-
修改文件arch/arm/mach-s3c64xx/Makefile
#vi arch/arm/mach-s3c64xx/Makefile
在文件的末尾添加如下代码:
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += dev-ts-mini6410.o
-
修改文件drivers/input/touchscreen/Makefile
在末尾添加如下代码:
obj-$(CONFIG_TOUCHSCREEN_MINI6410) += mini6410-ts.o
obj-$(CONFIG_TOUCHSCREEN_1WIRE) += mini6410_1wire_host.o
obj-$(CONFIG_FB_S3C_EXT_TFT800480) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_TFT480272) += ts-if.o
obj-$(CONFIG_FB_S3C_EXT_X240320) += ts-if.o
-
修改drivers/input/touchscreen/Kconfig
#vi drivers/input/touchscreen/Kconfig
在190行左右config TOUCHSCREEN_S3C2410的配置项后面加入如下代码(菜单项):
注意!!!下面有缩进行当最左边的缩进至少需要一个TAB缩进。
config TOUCHSCREEN_MINI6410
tristate "S3C touchscreen driver for Mini6410"
depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX
default y
help
Say Y here to enable the driver for the touchscreen on the
FriendlyARM Mini6410 development board.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called mini6410-ts.
config TOUCHSCREEN_1WIRE
tristate "Mini6410 1-Wire host and Touch Screen Driver"
depends on MACH_MINI6410
help
Say Y here to enable the 1-Wire host and Touch Screen driver for
FriendlyARM Mini6410 development board.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called mini6410_1wire_host.
-
修改文件arch/arm/mach-s3c64xx/mach-mini6410.c
#vi arch/arm/mach-s3c64xx/mach-mini6410.c
将#include <plat/ts.h>改成#include <mach/ts.h>
在210行左右,将
static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
.delay = 10000,
.presc = 49,
.oversampling_shift = 2,
};
改成
static struct s3c_ts_mach_info s3c_ts_platform __initdata = {
.delay = 0xFFFF,
.presc = 0xFF,
.oversampling_shift = 2,
.resol_bit = 12,
.s3c_adc_con = ADC_TYPE_2,
};
在436行将
s3c24xx_ts_set_platdata(&s3c_ts_platform);
改成
s3c_ts_set_platdata(&s3c_ts_platform);
-
修改文件arch/arm/plat-samsung/Makefile
#vi arch/arm/plat-samsung/Makefile
在60行左右,注释掉:obj-$(CONFIG_SAMSUNG_DEV_TS) += dev-ts.o,不然会有multiple definition of `s3c_device_ts'的错误很奇怪,友善的源码CONFIG_SAMSUNG_DEV_TS=n,而我的源码出来后CONFIG_SAMSUNG_DEV_TS=y,还改不掉。
-
修改drivers/input/touchscreen/mini6410-ts.c
#vi drivers/input/touchscreen/mini6410-ts.c
增加头文件#include<linux/sched.h>。奇怪的是友善的mini6410-ts.c里没这个头文件也能找到需要的东西。
-
配置内核
#make menuconfig
Device Drivers --->
Input device support --->
[*]Touchscreens --->
<*> S3C touchscreen driver for Mini6410
<*> Mini6410 1-Wire host and Touch Screen Driver
-
重新编译内核并测试
#make
测试:
#cat /dev/touche…….1wire….
按触摸屏,如果终端有乱码出处,说明OK
此时,下载到开发板,无法出现图形界面,出现如下错误:
Cannotcreate semaphore /tmp/qtembedded-0/QtEmbedded-0 'd'
Error 38Function not implemented
Cannotget display lock
Aborted
原来是没有设置远程通信。
-
设置远程通信
#make menuconfig
General setup --->
[*] System V IPC
再编译。