今天终于让linux内核在飞凌ok6410的板子上跑起来了,想来也是艰辛,为了移植成功,断断续续做了将近两个月的努力,期间郁闷不可言语形容啊, 了解其中艰辛,将自己移植步骤与心得与大家分享,希望对初踏次领域之人有所帮助,我所写的成果一部分也是网上前辈的所作,并非本人原创。
一、 移植环境
主 机:VMWare-Ubuntu
开发板:飞凌OK6410 nandflash,Kernel:2.6.36.2
编译器:arm-linux-gcc-4.3.2.tgz
u-boot:u-boot-1.1.6
注:编译器和u-boot 都是飞凌开发板自带的
二、 源码获得
内核源码到http://www.all.kernel.org/下载;
三、 移植步骤:
1.将Linux2.6.34.2内核源码放到工作目录文件夹下,并解压。
#tar xzvf linux2.6.36.2.tar.gz –c /
#pwd
/
# cd linux2.6.36.2
2. 修改内核源码根目录下的Makefile文件(CROSS_COMPILE =的值因个人情况而定,其他可以照做,蓝色部分为修改部分。)
#gedit Makefile
......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/
# -e s/arm.*/arm/ -e s/sa110/arm/
# -e s/s390x/s390/ -e s/parisc64/parisc/
# -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
ARCH = arm
CROSS_COMPILE = /usr/local/arm/usr/local/arm/4.3.2/bin/arm-none-linux- gnueabi-
3添加NandFlash分区信息.
修改arch/arm/mach-s3c64xx/mach-smdk6410.c文件,添加Nand Flash的分区信息和Nand Flash的硬件信息。(蓝色字体为添加部分)
#pwd
#gedit mach-smdk6410.c //add here
// 注意:此处的nandflash分区信息是飞凌自带的2.6.28的内核设置,由于此处要用到uboot是飞凌的,所以分区信息也要按人家的来
添加头文件
#include
#include
#include
#include
struct mtd_partition s3c_partition_info[] = {
{
.name = "Bootloader",
.offset = 0,
.size = (256*SZ_1K),
.mask_flags =MTD_CAP_NANDFLASH,
},
{
.name = "Kernel",
.offset = (256*SZ_1K),
.size = (4*SZ_1M) - (256*SZ_1K),
.mask_flags = MTD_CAP_NANDFLASH,
},
#if defined (CONFIG_SPLIT_ROOT_FILESYSTEM)
{
.name = "Rootfs",
.offset = (4*SZ_1M),
.size = (80*SZ_1M),//
},
#endif
{
.name = "File System",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
static struct s3c2410_nand_set s3c_nandset[]={
[0]= {
.name ="s3c24xx-nand",
.nr_chips = 1,
.nr_partitions =ARRAY_SIZE(s3c_partition_info),
.partitions =s3c_partition_info,
}
};
static struct s3c2410_platform_nand s3c_platform={
.tacls =25,
.twrph0 =55,
.sets = &s3c_nandset,
.nr_sets =ARRAY_SIZE(s3c_nandset),};
//add here…
static struct platform_device *smdk6410_devices[] __initdata = {
#ifdef CONFIG_SMDK6410_SD_CH0
&s3c_device_hsmmc0,
#endif
#ifdef CONFIG_SMDK6410_SD_CH1
&s3c_device_hsmmc1,
#endif
&s3c_device_i2c0,
&s3c_device_i2c1,
&s3c_device_fb,
&s3c_device_ohci,
&s3c_device_usb_hsotg,
&s3c64xx_device_iisv4,
//add here
&s3c_device_nand,
//add here…
}
static void __init smdk6410_map_io(void){
u32 tmp;
//add here
s3c_device_nand.name = "s3c6410-nand";
//add here…
…
}
static void __init smdk6410_machine_init(void){
u32 cs1;
s3c_i2c0_set_platdata(NULL);
s3c_i2c1_set_platdata(NULL);
s3c_fb_set_platdata(&smdk6410_lcd_pdata);
//add here
s3c_nand_set_platdata(&s3c_platform);//
//add here…
}
5.配置内核。(arch/arm/configs/目录下是一般内核的默认配置)
支持NandFlash
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C/S3C SoC
再把这个选项选上
device drivers ->
Memory Technology Device (MTD) support --->
Caching block device access to MTD devices
(此出勾选可防止出现:VFS: Cannot open root device "mtdblock2" or unknown-block(2,0) 错误)
保存退出
复制config文件,编译内核
#pwd
#/linux2.6.34.2
#cp –f arch/arm/configs/s3c6400_defconfig .config
可以使用make menuconfig对刚刚配置的内核根据具体的情况进行修改,开始我没有进行修改直接make zImage,最后在arch/arm/boot/目录下生成zImage镜像文件。
6.编译内核 make zImage
下载到板子上,发现如下问题,此问题郁闷我最久,
…………………………………..
CPU: Testing write buffer coherency: ok
s3c6400-nand: failed to claim resource 0
WARNING: at drivers/base/core.c:130 device_release+0x70/0x84()
…………………………………………………….
------------[ cut here ]------------
WARNING: at drivers/base/core.c:130 device_release+0x70/0x84()
Device 's3c64xx-rtc' does not have a release() function, it is broken and must be fixed.
Modules linked in:
……………………………………………………….
[] (kernel_init+0x94/0x14c) from [] (kernel_thread_exit+0x0/0x8)
---[ end trace 1b75b31a2719ed1e ]---
------------[ cut here ]------------
WARNING: at drivers/base/core.c:130 device_release+0x70/0x84()
Device 's3c64xx-pata.0' does not have a release() function, it is broken and must be fixed.
Modules linked in:
……………………………………………………………………………..
这个问题就是在mach-smdk6410.c 中的static struct platform_device *smdk6410_devices[] __initdata = {
……………………………………………….
&smdk6410_smsc911x,
&s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_rtc,
&s3c_device_ts,
&s3c_device_wdt,
&s3c_device_nand,
}; 结构体中所有设备都找不到释放函数,经过分析,可能是这些板级设备初始化时出现问题,所以系统调用释放资源的函数,可是内核中没有这些函数(可能是没有必要吧,所以内核中没有定义!此上纯属个人胡猜,希望高手指正),所以出现如上问题,通过我大量的分析,问题在static struct resource s3c_nand_resource[](路径:arch./arm/plat-samsung) 这个机构体中,
static struct resource s3c_nand_resource[] = {
[0] = {
.start = S3C_PA_NAND,
.end = S3C_PA_NAND + SZ_1M-1,
.flags = IORESOURCE_MEM,
}
};
.end = S3C_PA_NAND + SZ_1M-1, 这个值后面再减去1,就可以了,这是对比其他的设备资源结构做出的修改,此处涉及到这些设备的总线地址范围,我琢磨着出现上述问题,就是这个总线地址冲突了,希望高手指正啊!(内核中的定义,怎么会出现错误呢,这地方我还真搞不懂啊),不知道自己修改的合适不合适
所以解决方法就是修改arch./arm/plat-samsung/dev-nand.c 中的
static struct resource s3c_nand_resource[] = {
[0] = {
.start = S3C_PA_NAND,
.end = S3C_PA_NAND + SZ_1M-1,
.flags = IORESOURCE_MEM,
}
};
.end = S3C_PA_NAND + SZ_1M-1, 减去一就行了
7.再次编译内核,下载运行:
…………………………………
ifconfig: socket: Function not implemented
Try to bring eth0 interface up......ifconfig: socket: Function not implemented
ifconfig: socket: Function not implemented
ifconfig: socket: Function not implemented
route: socket: Function not implemented
Done
Starting Qtopia, please waiting...
Please press Enter to activate this console. touch...
说明内核已经成功引导启动文件系统,只不过现在的内核没有触摸板驱动,下一步你就可以移植一下触摸板驱动了
此教程只是本人所遇到问题的总结,一些问题只做参考,交流,并不具备通用性,如按照上述步骤遇到问题,联系我,可以帮着一起解决,本人菜鸟,教程制作仓卒,如有错误,请大家见谅,
引用文章:
http://hi.baidu.com/serial_story ... fd0edd267fb500.html
http://www.linuxidc.com/Linux/2010-08/27828p3.htm
http://www.witech.com.cn
关键字:Linux2.6.36 移植 飞凌S3C6410
引用地址:
Linux2.6.36移植到飞凌S3C6410开发板 步骤
推荐阅读最新更新时间:2024-03-16 14:43
uC/OS-II在ARM系统上的移植与实现
0 引言
在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点 . 将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II 是由Jean J . Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任务内核.uC/ OS - II 的源代码完全开放,这是其他商业实
[嵌入式]
移植到STM32fl13野火开发板上遇到的问题
前些日子,在自己将uCOS移植到了野火开发板上,然后又LwIP也移植到了野火开发板,uCOS+LwIP程序很正常,基本功能测试都OK(我建立一个TCP客户端,连接服务器正常,数据收发正常),于是又想着把uCGUI也给上去,结果却遇到了问题。uCGUI加到uCOS+Lwip上编译没有问题,而且单单用uCOS+uCGUI,显示完全正常,触屏也没有问题,是只要设计到Lwip的代码,程序就死掉了,uCOS连任务切换都不会了。换句话说是uCOS+Lwip可以用,uCOS+uCGUI可以用,uCOS+uCGUI+Lwip程序死翘翘了。(stm32 库v3.3, uCOSv2,86, uCGUI v3.9, lwip v1.3.2) 为什
[单片机]
linux2.6.32.2 mini2440平台移植-- 配置 USB 外设、SD卡移植
Linux-2.6.32.2 内核对 USB外设的支持是相当丰富的,并且已经包含了 S3C2440 的 USB Host 驱动支持,因此我们只要配置一下内核就可以了,下面是各种 USB外设的详细配置步骤。 1.4.1 配置和测试 USB键盘、扫描器和鼠标 在内核源代码目录的终端输入:make menuconfig,依次选择如下子菜单项: Device Drivers --- HID Devices --- 按空格键选中 USB Human Interface Device (full HID) support ,这样就配置好了 USB键盘和鼠标项。 提示:这里的配置选项对应的内核源代码目录是:linu
[单片机]
移植U-Boot.1.2.0到友善之臂S3C2440 (2)
8、在个文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。 (1)/include/common.h文件的第454行: #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440) (2)/include/s3c24x0.h文件的第85、95、99、110、148、404行: #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440) (3)/cpu/arm920t/s3c24x0/inte
[单片机]
教大家如何在STM32F4上跑freeRTOS
之前挖了图解freeRTOS的坑,挖了坑就得填。今天就从使用开始,先把freeRTOS用起来。先聊一聊在STM32F407上的如何电灯,如果只用freeRTOS点灯,无疑有点杀鸡用牛刀的感觉。但是想用freeRTOS做产品,先照类似步骤则可以验证最小系统,验证freeRTOS是否能正确跑起来,再在此基础上开始做应用开发,就把任务分解了。本文主要梳理一下如何利用官方移植例子,创建一个自己demo工程,对于没用过的有点参考价值。 注:本文基于IAR for ARM 8.22.1(个人喜欢IAR),硬件采用正点原子的STM32F407探索者开发板,STLink V2。 准备工作去官网https://www.freertos.org/
[单片机]
μC/OS-II在凌阳单片机SPCE061A上的移植
摘要:以凌阳单片机为例详细介绍μC/OS-II的移植方法;重点讲解在系统移植过程中一些难以理解的概念,并首次实现了μC/OS-II在凌阳SPCE061A单片机上的移植。 关键词:μC/OS-II 凌阳单片机 嵌入式系统 目前,实时操作系统已广泛应用于工业控制的各个领域。μC/OS-II作为一个实时内核,由于其源码公开、代码规范,广受开发人员的喜爱。SPCE061A是凌阳公司继μ’nSPTM系列产品SPCE500A等之后新推出的一款16位单片机,内部集成A/D、D/A等多种接口电路,能很方便地嵌入工业控制的各种场合。更重要的是,其内嵌2K字的SRAM和32K的Flash ROM,因此,在不需要扩展外部存储器的情况下就可以实现μC/
[嵌入式]
STM32开发笔记66: 移植看门狗驱动程序到STM32L053R8T6
单片机型号:STM32L053R8T6 在文章STM32开发笔记45:看门狗驱动程序的移植已经介绍了看门狗驱动程序的移植方法,其实现的是将STM32CubeMX中的驱动程序,移植到自己已有的工程中。本文将介绍将STM32F070F6P6上的看门狗驱动程序移植到STM32L053R8T6的方法,步骤如下: 1、在1_bsp层引入STM32官方的驱动程序stm32l0xx_hal_iwdg.c,并修改stm32l0xx_hal_conf.h中的内容,使能内部看门狗,相关程序如下,然后进行编译,形成bsp.lib #define HAL_MODULE_ENABLED /*#define HAL_ADC_MODULE_ENA
[单片机]
ucgui在stm32上的移植
在MDK环境下将3.90版本的UCGUI移植到STM32下了,为了方便大家,特写此移植方法,大家可以借鉴(有错误之处,望大家指点出来共同讨论!) 移植步骤: 第一步:首先,得把你的TFT底层驱动写好,既在裸机下,可以正常显示。 第二步:加入UCGUI程序包。 第三步:配置LCDConf.h GUIConf.h GUITouchConf.h(由于我的液晶不带触摸功能,此配置在此不讲。) 配置LCDConf.h文件如下: #ifndef LCDCONF_H #define LCDCONF_H #define LCD_XSIZE (160) //配置TFT的水平分辨率 #define LCD_Y
[单片机]