移植2.6.30.4到MINI2440

发布者:廿由人最新更新时间:2022-06-07 来源: eefocus关键字:移植  6  MINI2440 手机看文章 扫描二维码
随时随地手机看文章

移植2.6.30.4到MINI2440上锻炼一下自己

这篇学习笔记以失败为基础向前推进~ 重点在于如何发现问题和解决问题的方法,因为我硬件基础还不足,所以像DM9000这样的硬件初始化我会以”暴力”方法来解决~ 哈哈~


下面开始和大家分享我的失败过程~:

解压缩内核压缩文件后进入到目录中,然后修改Makefile,找到
ARCH ?=
CROSS_COMPILE ?=
这两项,不修改这两项的话将会默认使用x86的配置,这里修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
arm-linux- 是交叉编译器~ 这里我使用的交叉编译器为友善送的arm-linux-gcc-4.3.2.tgz,带EABI

然后执行make menuconfig,然后进入System Type中看看是否为ARM体系~
第一行为ARM system type 说明没错~  然后在ARM system type中选择SamSung “S3C2410...”
随后在下面出现的S3C2440 Machines中选择SMDK2440

退出保存~ 执行make zImage
出现ERROR
drivers/video/console/vgacon.c:510:error “PCIMEM_BASE undeclared”
是在vgacon_startup中,vgacon是啥?~ 不认识~ 应该是不必要的东西~ 去掉它~
vim drivers/video/console/Makefile
在里面看见了这句
obj-$(CONFIG_VGA_CONSOLE) += vgacon.o
然后执行 find ./ -name “Kconfig” | xargs grep “VGA_CONSOLE”
看见config VGA_CONSOLE 在driver/video/console/Kconfig中
也就是说在驱动->视频->终端中,执行make menuconfig
在Device Drivers->Graphics Support->Console display driver support中发现了VGA text console
去掉它,保存设置后再编译

编译完成后将在arch/arm/boot中得到zImage文件

使用SuperVivi的USB加载功能启动这个内核文件~ 得到下列输出

zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux........................................................................................................ done, booting the kernel.

失败
信息不够丰富~ 根据kasim大大的指点,在配置中进入Kernel hacking
打开Kernel debugging和Kernel low-level debugging functions 还有 Kernel low-level debugging messages via S3C UART
保存后再编译

运行zImage后得下列输出
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux........................................................................................................ done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).

Available machine support:

ID (hex)        NAME
0000016a        SMDK2440

Please check your kernel config and/or bootloader.

失败
原来是machine的ID和Supervivi传递进来的ID不匹配~
关于machine ID,可以参考一下这篇文章
<2.6.18-2内核中对S3C2440的引导启动分析>
虽然版本老了点,但是核心思想还是没有变

vim arch/arm/mach-s3c2440/mach-smdk2440.c
在最后一段有这句 MACHINE_START(S3C2440 , ”SMDK2440”)
这里S3C2440就是machine ID的代号~ 呢具体值是多少呢?~
在arch/arm/tools/mach-types中
s3c2440 ARCH_S3C2440 S3C2440 362
原来我们的machine ID是362~
呢bootloader传递进来的值是多少呢?~
Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).
注意到没有?~ 0x7CF转换成10进制也就是1999
修改mach-types中的对应项
s3c2440 ARCH_S3C2440 S3C2440 1999
虽然这样就和下面MINI2440的1999冲突了,但是只要不加入MINI2440的配置就没事

修改后编译,再执行zImage后得下列输出

zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux........................................................................................................ done, booting the kernel.

失败
咦?~ 啥都没有?~ 最起码也应该有个乱码吧  这时候我的第一反应是会不会没有跳入到start_kernel中
所以马上编辑init/main.c,在start_kernel的前部加上printk(KERN_INFO “in start_kernel n”);
但是这个时候内核还没有初始化,所以printk是没有作用的~
继续得到kasim大大的指点,编辑kernel/printk.c中的printk函数
{
    va_list args;
    int r;

#ifdef CONFIG_DEBUG_LL
    extern void printascii(const char *);
    char buff[256];
#endif
    va_start(args, fmt);
    r = vprintk(fmt, args);
#ifdef CONFIG_DEBUG_LL
    vsprintf(buff, fmt, args);
#endif
    va_end(args);

#ifdef CONFIG_DEBUG_LL
    printascii(buff);
#endif
return r;
}

编译后执行zImage,得下列输出

zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux........................................................................................................ done, booting the kernel.
<6>in start_kernel
<6>Initializing cgroup subsys cpuset
<6>Initializing cgroup subsys cpu
<5>Linux version 2.6.30.3 (wolf@ubuntu) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #4 Wed Aug 5 16:54:49 CST 2009
.........................
.........................

失败
虽然正常输出了~ 有进入start_kernel~ 但是为什么之前每输出呢?~ 会不会是没有找到输出设备
在输出中看到这行
<5>Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
console=ttySAC0 会不会是没有ttySAC0这个设备呢~ 在内核中搜索ttySAC 在driver/serial/samsung.c中得到对应项目
这时候我猜想会不会没有加载samsung.c , 经过一轮Makefile和Kconfig的查询 , 发现对应选项在Device Drivers->Character devices->Serial drivers中
一看,原来根本就没有加载Samsung SoC serial support , 选成静态编译之后又出现了Support for console on Samsung SoC serial port ,就是它了,选上, 退出的时候顺便把Kernel low-level debugging functions给取消了
否则我们设置的printk会自行输出,就不知道ttySAC有没有加载成功了

编译后执行,得下列输出
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux......................................................................................................... done, booting the kernel.
w# €DpñGpGp´ó70ÇC¼ØûÛ»›3ó•ó¸Û0ƒw# €DpñGpGp´ó•tØ›•p¸›7¿³ó•@û7¼¿[£¼Û3•¼ó;£¸ÀÛ;[7û;D°•€D@GoGpGpíó•t›7•{ð#ßóÄ;›•770ÄÄ3Çß;GoDh}û7wœ´{„[ó7ûÛ›30°ôܸ‡#_sÄ;›•770Øijœ¼DG@ÁôÛ•ûÄ;•sÄ›£Ø›•DŽ³ÃÛ70ÄGpÁ4ßœ»ôGã›30³D˜ßF[s˜£ÀÛû70ÛD8ßÄ4G8ôGv£°ÇÃGpÍ´0ƒ÷# €DpñGš´;óC„[4¸F¸ÄÛtÜàGp}4GGÇ4tD@Ä38ÀGpG߀ôØ Û›Ÿ€ÄÛDCûƒ£¸ƒ;7v›Ã30Ü›4Û´£ô¼;C3[;7ù³û770‡¸°[•4tD@Ä38ÀGpG߀´´p‡ƒ•ô¼Û7Ÿ€tÛG»4œØ„Çpíƒw#
.......................................

失败
但这说明ttySAC加载成功了~  不过为什么是乱码呢?~
这时候就需要对比友善的配置和我们的配置有什么不同了~
打开友善送的linux-2.6.29,观察arch/arm/mach-s3c2440/mach-mini2440.c和我们的2.6.30.4下面的arch/arm/mach-s3c2440/mach-smdk2440.c有什么不同
由于乱码主要是时钟问题,所以我们重点观察UART的设置和基本设置,其它什么NAND LCD的就不看先

修改smdk2440_uartcfgs[]
[2] = {
 .ulcon = 0x03,
}

修改s3c24xx_init_clocks(12000000);

然后编译再运行,输出为
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
Uncompressing Linux......................................................................................................... done, booting the kernel.
[    0.000000] in start_kernel
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
...........................
最后为
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

失败
终于可以正常输出了,但是根文件系统挂载失败
因为板子上的根文件系统为yaffs2 这时候内核还没有这个文件系统的支持,需要我们加上去
拷贝友善的送的2.6.29下的fs/yaffs2目录 到我们的fs目录下
然后修改观察一下友善的送的2.6.29下的fs/Kconfig 和 fs/Makefile和我们的有什么不同
在我们的Kconfig中的 source “fs/jffs2/Kconfig” 上面加上 source “fs/yaffs2/Kconfig”
在Makefile中的 obj-$(CONFIG_FAT_FS) += fat/ 上面加上 obj-$(CONFIG_YAFFS_FS) += yaffs2/

然后在配置的 File systems->Miscellaneous filesystems 中选上 “YAFFS2 file system support” “Autoselect yaffs2 format”  “Cache short names in RAM”

然后编译运行,输出如下
......................
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

失败
还是不行,往上看几行
VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
原来是没有可用的分区
这个时候就要更正我们的NAND配置了
还是对照友善送的linux-2.6.29,观察arch/arm/plat-s3c24xx/common-friendly-smdk.c来修改我们的arch/arm/plat-s3c24xx/common-smdk.c

主要修改smdk_default_nand_part[]
{
 [0] = {
  .name = “supervivi”,
  .size = 0x00060000,
  .offset = 0,
},
[1] = {
 .name = “Kernel”,
 .offset = 0x00060000,
 .size = 0x00200000,
},
[2] = {
 .name = “root”,
 .offset = 0x00260000,
 .size = 1024*1024*1024,
},
[3] = {
 .name = “nand”,
 .offset = 0x00000000,
 .size = 1024*1024*1024,
}
};

编译后运行,输出
VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

失败
还是不行,连最起码的分区都没有看见,会不会是MTD没有加载呢?~
打开配置进入Device Drivers
Memory Technology Device ......... 前面是个M~ 说明这个模块是动态加载的,而我们编译的zImage里面只有静态模块
将MTD选为静态加载,然后进入MTD配置中看看还有什么需要选的
NAND Device Support 这个也是动态,选为静态加载
进入NAND Device Support
原来连NAND Flash support for S3C2410/S3C2440 SoC都没选,马上选为静态加载

保存配置后编译运行,再运行输出如下:
NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
Creating 4 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000060000 : "supervivi"
0x000000060000-0x000000260000 : "Kernel"
0x000000260000-0x000040260000 : "root"
mtd: partition "root" extends beyond the end of device "NAND 128MiB 3,3V 8-bit" -- size truncated to 0x7da0000
0x000000000000-0x000040000000 : "nand"
mtd: partition "nand" extends beyond the end of device "NAND 128MiB 3,3V 8-bit" -- size truncated to 0x8000000
...............................
VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

失败
还是没有可用分区,虽然成功分辨了分区,但是没有加载成功,估计还是在MTD的模块选择上
这时候需要对照友善的配置,经过对比,发现在友善的配置中静态编译了MTD中的下面3个模块
Direct char device access to MTD devices
Common interface to block layer for MTD ‘translation layers’
Caching block device access to MTD devices
我们也选为静态编译
保存配置后编译运行,输出如下

List of all partitions:
1f00             384 mtdblock0 (driver?)
1f01            2048 mtdblock1 (driver?)
1f02          128640 mtdblock2 (driver?)
1f03          131072 mtdblock3 (driver?)
No filesystem could mount root, tried:  cramfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

[1] [2]
关键字:移植  6  MINI2440 引用地址:移植2.6.30.4到MINI2440

上一篇:arm-Linux 编译动态库 简单实例
下一篇:at91sam9260 开发环境的建立

推荐阅读最新更新时间:2024-11-09 10:39

Inova推出全新APIX3® SerDes产品 支持多达4台菊花链式显示器
2月19日,微芯片制造商Inova Semiconductors宣布发布其INAP567TAQ和INAP597TAQ发射机IC,进一步扩展APIX3 SerDes产品系列。APIX(Automotive Pixel Link,汽车像素链路)是Inova为汽车高分辨率视频应用程序开发的多通道SerDes(串行器/解串器)技术。这些IC主要用于车辆驾驶舱和信息娱乐系统。最新一代APIX3即使使用带宽高达12Gbit/s的菊花链式显示器,也可以建立多个显示器连接,并支持高清和超高清显示器。 图片来源:Inova Semiconductors 全新INAP567TAQ和INAP597TAQ发射机提供DisplayPort 1
[汽车电子]
Inova推出全新APIX3® SerDes产品 支持多达<font color='red'>4</font>台菊花链式显示器
使用51单片机和DS1302时钟芯片做一个简易的电子时钟
一、前言 今天给大家推荐一个51单片机小实验,带你使用51单片机做一款简易的电子时钟,其中计时模块采用DS1302硬件模块,显示采用LCD显示屏,具体怎么实现开来一起看看吧! 二、DS1302模块介绍 DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟和31字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟、日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年自动补偿等多种功能。时钟操作可通过 AM/PM 指示,DS1302 与单片机之间能简单地采用同步串行的方式进行通信,简易三线SPI通信模式: RES 复位 I/O 数据线 SCLK 串行时钟 SPI
[单片机]
使用51单片机和DS1<font color='red'>30</font>2时钟芯片做一个简易的电子时钟
2月中国智能手机SoC排名:联发科、高通、苹果、海思、紫光展锐前五
3 月 31 日消息,昨日晚间,CINNO Research 发布报告,带来了 2 月中国智能机 SoC 排名。其中,联发科、高通、苹果、海思、紫光展锐位列前五位。 CINNO Research 最新数据显示,2 月中国智能机 SoC 市场终端销量在 1 月环比同比双升后出现回落,整体市场终端销量环比下降约 24%,同比下降约 20.5%,其中同比大幅下降主要来自海思。 IT之家了解到,报告指出,2 月中国智能机 SoC 细分市场中,高通与紫光展锐环比降幅小于整体市场平均,高通环比降幅约为 21.8%;同时,海思降幅最大,约为 28.2%;联发科降幅第二,约为 25%。 苹果在 2 月中国大陆智能机 SoC 终端销量中
[手机便携]
<font color='red'>2</font>月中国智能手机SoC排名:联发科、高通、苹果、海思、紫光展锐前五
Gartner:2022年全球IaaS公有云服务市场增长30%,首次突破1000亿美元
2023年8月2日 - 根据Gartner的统计结果,2022年全球基础设施即服务(IaaS)市场从2021年的928亿美元增长到1203亿美元,同比增长29.7% 。亚马逊在2022年继续排在IaaS市场的第一名,其次是微软、阿里巴巴、谷歌和华为。 Gartner研究副总裁Sid Nag 表示:“云已经从一项革命性的技术上升为一项革命性的业务。由于买家不断地往云中添加更多应用并对当前的应用进行现代化升级,IaaS已成为推动软件即服务(SaaS)和平台即服务(PaaS)增长的驱动力。” “IaaS在2022年的增长强于预期,只是在第四季度由于客户致力于充分利用其先前投入的容量而略有放缓。这种情况预计将持续到2023年中期,
[网络通信]
Gartner:2022年全球IaaS公有云服务市场增长<font color='red'>30</font>%,首次突破1000亿美元
MSP430F149让LED灯闪烁
程序: //让LED灯闪烁 #include msp430x14x.h void main(void) { P6DIR |= BIT2;P6OUT |= BIT2; //关掉电平转换(不必纠结) WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P3DIR |= BIT3; // Set P3.4 to output direction for (;;) //一直循环,一直执行,一直取反 { volatile unsigned int i; //volatil
[单片机]
STM32F103C8T6单片机程序烧录教程
本次使用STM32F103C8T6型号单片机进行程序烧录演示,采用ST-Link方式烧录程序,程序烧录前确保已经安装好Keil MDK软件和ST-Link驱动。如没请在公众号菜单栏的软件获取Keil MDK软件和ST-Link驱动(在Keil MDK软件安装的最后部分有驱动安装教程)。PS:下图烧录器示意图的引脚与烧录器实物的引脚位置是不一样的,图片仅供参考。 1、硬件连接:其中烧录器的SWCLK接系统板的DCLK,烧录器的SWDIO接系统板的DIO,烧录器的GND连接系统板的GND,烧录器的3.3V接系统板的3.3。 2、打开程序。 3、在Keil MDK软件中设置ST-Link烧录程序方式:点击”Option
[单片机]
STM32F103C8T<font color='red'>6</font>单片机程序烧录教程
对标 Arm Neoverse N2,SiFive 推出数据中心级 RISC-V 内核设计 P870-D
8 月 15 日消息,RISC-V IP 企业 SiFive 当地时间昨日宣布推出面向数据中心应用的 P870-D CPU 设计。 P870-D 建立在 SiFive 于 2023 年发布的 P870 高性能核心之上,并新增了诸多面向数据中心应用的功能: P870-D 支持开放的 AMBA CHI 协议,单集群至高 64 核,整体至高 256 核,而原版 P870 支持至多 32 核集群; SiFive 还为 P870-D 增加了 RAS 功能,可在问题出现前检测到错误并保护数据完整性,有助于防止停机并确保系统的整体可靠性; 此外 P870-D 还包含一个分布式和可扩展的 IOMMU(IT之家注:输入输出内存管理单元,Inp
[嵌入式]
对标 Arm Neoverse N<font color='red'>2</font>,SiFive 推出数据中心级 RISC-V 内核设计 P870-D
铠侠发布EXCERIA PLUS G2移动固态硬盘系列
全新的移动闪存设备,以其时尚经典的设计,为日常用户带来更佳的使用体验 2024年10月17日 - 铠侠株式会社,全球领先的存储解决方案供应商,今日宣布推出EXCERIA PLUS G2移动固态硬盘系列 。该系列是一款全新的外置存储解决方案,计划于近日(1) 上市。EXCERIA PLUS G2移动固态硬盘系列采用铠侠的SSD技术和BiCS FLASH™ 3D闪存,并采用紧凑、优雅、便携 (2) 的设计,特别适合需随身携带数据的用户。 该移动固态硬盘系列小巧便携,手掌大小即可存储多达2TB的数据,同时它还具有极高的抗震性,符合MIL-STD跌落试验标准(3) 。与上一代EXCERIA PLUS移动固态硬盘相比,新款E
[嵌入式]
铠侠发布EXCERIA PLUS G<font color='red'>2</font>移动固态硬盘系列
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved