内核编译与移植(三)

在硕数的核心板上,使用的是SMSC公司的网卡芯片,型号为LAN9220。此芯片在Linux-3.0.99内核中可以支持,因此修改进来就方便多了。
先修改文件arch/arm/mach-s3c2416/mach-smdk2416.c,用vi打开它,先在包含头文件部分加入一句“#include <linux/smsc911x.h>”,把SMSC LAN9220网卡的头文件包含进来。然后找到结构体“static struct platform_device *smdk2416_devices[] __initdata”定义这一句,在此句前加入几个空行,然后输入下面的内容(注:不是插入在结构体内,是插在结构体之前!):
static struct resource s3c_smc911x_resources[] = {
[0] = {
.start = 0x08000000,
.end = 0x08000000 + SZ_16M - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_EINT(4),
.end = IRQ_EINT(4),
.flags = IORESOURCE_IRQ,
},
};
struct platform_device s3c_device_smc911x = {
.name = "smc911x",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_smc911x_resources),
.resource = s3c_smc911x_resources,
};
struct smsc911x_platform_config s3c_smsc911x_config = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
struct platform_device s3c_device_smsc911x =
{
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_smc911x_resources),
.resource = s3c_smc911x_resources,
.dev = {
.platform_data = &s3c_smsc911x_config,
},
};
添加完成后,在刚才找到的结构体内,加入一句“&s3c_device_smsc911x,”,以向内核注册网卡设备。完成后的结构内容如下:
static struct platform_device *smdk2416_devices[] __initdata = {
&s3c_device_fb,
&s3c_device_wdt,
&s3c_device_ohci,
&s3c_device_i2c0,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_usb_hsudc,
&s3c_device_smsc911x,
};
更改完成后存盘退出。接下来修改文件drivers/net/smsc911x.c,同样用vi打开它,然后找到“irq_flags | IRQF_SHARED, dev->name, dev);”这一句,把它改成“irq_flags | IRQF_SHARED | IORESOURCE_IRQ_LOWLEVEL, dev->name, dev);”,以添加网卡中断的电平触发方式。更改完成后存盘退出。
最后还需要在内核中配置一下,同样执行“make menuconfig”打开配置对话框,勾选Device Drivers -> Network device support -> Ethernet (10 or 100Mbit) -> SMSC LAN911x/LAN921x families embedded ethernet support项。完成后保存退出,接下来再次编译修改过的内核,先执行“make clean”命令清理一下,然后执行“make zImage”进行编译。编译完成后把生成的zImage内核映像文件下载到开发板上,启动内核,启动完成后如下图所示。

从上图中可以看出,网卡已经认出来了,输入命令“ifconfig”并回车,就可看到给网卡分配的IP地址了,你可以试着ping一下PC机,应该可以ping通了,这说明网卡工作是正常的。
接下来看USB口和SD卡,会发现在开发板上插入U盘或SD卡时,系统认不出来,通过执行命令“cat /proc/partitions”可以看出,分区仍然只有原来NandFlash上的三个分区,并未增加新的分区,所以USB口和SD卡并未起作用,接下来就进行修改。先看USB口,其实从启动显示的信息中可以看出,USB口其实已经是正常的了,那为何插入U盘不能用呢?其实这是由于配置问题所至。在源码根目录下执行“make menuconfig”打开配置对话框,进行以下设置:
1.进入System Type一项,找到其中的“***System MMU***”这一栏,把下面的S3C2400 Machines、S3C2410 Machines、S3C2412 Machines、S3C2440 and S3C2442 Machines、S3C2443 Machines各项下的所有子选项全部清除(不勾选),只留下S3C2400 Machines下面的SMDK2416一项勾选上。
2.进入Device Drivers -> USB support选项,这里的选项较多,注意一定按照下面的顺序操作:a、先把原来默认为“M”的选项清除(不勾选);b、勾选USB Mass Storage support一项;c、勾选USB Gadget Support一项并回车进入子选项;d、勾选Debugging messages (DEVELOPMENT)项和Debugging information files (DEVELOPMENT)项。
其他选项按默认,完成后存盘退出,再次编译内核。把编译好的内核zImage下载到开发板上启动,启动完毕后在开发板上插入一个FAT32格式的U盘,会发现U盘已经识别出来并被挂载到了/media/sda1目录下,进入该目录就可看到U盘里的内容了,如下图所示。

此时再执行命令“cat /proc/partitions”就可看到U盘上的分区了。但是到此SD卡还是不能识别,所以还要继续修改配置文件。在源码根目录下执行“make menuconfig”打开配置对话框,继续进行以下设置:
1.勾选System Type -> S3C2410 DMA support一项。
2.进入Device Drivers -> MMC/SD/SDIO card support选项,按照下面的顺序操作:a、先把原来默认为“M”的选项清除(不勾选);b、勾选Secure Digital Host Controller Interface support一项;c、勾选SDHCI Support on Samsung S3C SoC一项;d、勾选DMA support on S3C SDHCI;e、勾选Hardware support for SDIO IRQ一项。
其他选项按默认,完成后存盘退出。接下来还要修改一下arch/arm/mach-s3c2416/mach-smdk2416.c文件,参考前面,同样在*smdk2416_devices[] __initdata结构体内加入一句“&s3c_device_rtc,”和一句“&samsung_asoc_dma,”,完成后的结构内容如下:
static struct platform_device *smdk2416_devices[] __initdata = {
&s3c_device_fb,
&s3c_device_wdt,
&s3c_device_ohci,
&s3c_device_i2c0,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_usb_hsudc,
&s3c_device_smsc911x,
&s3c_device_rtc,
&samsung_asoc_dma,
};
更改完成后存盘退出。以上是向内核注册DMA设备,顺带把实时时钟RTC也注册了。随后编译内核,并把编译好的内核映像文件zImage下载到开发板上去启动,启动完毕后在开发板上插入一张FAT32格式的SD卡,会发现SD卡已经识别出来并被挂载到了/media/mmcblk0p1目录下,进入该目录就可看到SD卡里的内容了,如下图所示。

进一步实验会发现,虽然已经看到了SD卡上的内容,但在对其内容进行修改或在SD卡上新建文件时,会出现“Read-only file system”的错误提示,这表明SD卡设备不可写。为了让其可写,还得继续修改源码。使用vi打开drivers/mmc/card/block.c文件,找到其中的“md->read_only=mmc_blk_readonly(card);”这一句,把它改成“md->read_only=0”即可。改完后保存退出,然后重新编译内核,再次把编译好的zImage文件下载到开发板上并启动,完毕再次插入SD卡并进入挂载目录/media/mmcblk0p1,尝试执行“touch abc”命令,会发现文件abc被成功创建,表明SD卡已经可以写入了。
至此,在硕数S3C2416核心板上移植Linux-3.0.99的工作就全部完成了。当然,我们只是让新内核在开发板上跑起来,其他的并没有进行优化,其实应该通过详细的内核配置来精简内核(比如上面内核中的DM9000网卡就可不要),这取决于你开发板上的资源以及你的应用需求,这里就不做讨论了,有兴趣的可自己慢慢研究。

原文地址:https://www.cnblogs.com/fxzq/p/12285952.html

时间: 2024-08-30 03:26:50

内核编译与移植(三)的相关文章

内核编译与移植(一)

在嵌入式Linux系统中,内核移植非常关键,没有Linux内核一切都是空谈,下面我们就来讨论一下Linux内核在S3C2416上的移植.首先,Linux是开源软件,其内核源代码可以直接到网站https://www.kernel.org/上下载.但Linux内核的版本非常之多,而且各个版本之间都存在有很多差异,那下载哪一个版本好呢?其实这个问题很难有统一的答案,但作为嵌入式系统开发本身来说,坚持两个原则是没错的:一是够用就好,不要去追求“高大尚”:二是能够维护好一套内核就行,不要一昧的去追新.如果

Linux内核编译详解

学习了网上的一些资料,自己试着摸索了一下,整理出这篇文章. 不当之处,还请大家批评指正.谢谢. 重要的参考资料有: http://raspberrypi.stackexchange.com/questions/192/how-do-i-cross-compile-the-kernel-on-a-ubuntu-host http://blog.csdn.net/xdw1985829/article/details/6833319 好了,下面进入正题. 一.准备工作 准备工作如何做,这里就不详说了.

linux内核编译与开发

一.Linux内核简介linux kernel map: linux 系统体系结构: linux kernel体系结构: arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RING0级别最高, 这样linux用户代码运行在RING3下,内核运行在RING0,这样系统本身就得到了 充分的保护 用户空间(用户模式)转到内核空间(系统模式)方法: ·系统调用 ·硬件中断 linux kernel 体系结构: 虚拟文件系统VFS: VFS(虚拟文件系统)隐藏各种文件系统的具体细节,

内核编译安装

以下讲的是内核基础.内核管理.安装编译内核.安装程序anaconda.kickstart. 1.内核基础 对于内核,现在有单内核和微内核设计,现在的内核多采用单内核和高度模块化设计,对于模块化设计,可以进行动态装卸载. 内核一般由三部分组成:内核核心文件.内核对象.ramdisk.内核核心文件,一般为bzImage,经过压缩处理的镜像文件,通常内核核心文件保存在/boot目录下,名称为vmlinuz-VERSION-release.内核对象,即内核额外的功能模块,该类文件放置于/lib/modu

第1章 Android系统的编译和移植实例:

第一章 本章Android系统的编译和移植实例,其中移植涉及的主要内容有下载Android Linux内核,安装交叉工具链,移植Android Linux内核支持EZ6410平台,安装Android SDK,获得Android根文件系统,设置系统环境,完成Android正常启动.安装交叉工具链在ldd6410-read-only目录下修改vim.cross_compile内容为:/usr/local/arm/arm-none-Linux-gnueabi/bin/arm-none-linux-gu

第一章 Android系统的编译和移植实例

第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入式Linux非常相似. 首先要准备一套可以正常运行Linux系统的一套开发版,需要在其移植Android系统,并能够正常运行. 移植的主要过程为: 1.下载Android Linux 内核 2.安装交叉工具链 3.移植Android Linux 内核支持的平台 4.安装Android SDK 5.获

学习第一章 Android系统的编译和移植实例后的心得体会

说起来,去年在岳老师的带领下就接触了嵌入式系统的编译和移植.而现在我们又开始接触Android系统的编译和移植.第一章主要介绍安卓系统的编译和移植技术.其实安卓和嵌入式非常相似. 安卓 移植涉及的主要过程大致分为六步:1.下载安卓linux内核. 2.安装交叉工具链.3.移植安卓linux内核支持EZ6410平台.4.安装安卓SDK.4.获得安卓根文件系统.5.设置系统环境,完成安卓正常启动.虽然步骤不多,但是涉及了很多东西.在开始内核移植之前,先完成工具链的搭建.在移植过程中会发现硬件差异.差

在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程

实验环境:Ubnuntu 64位(推荐使用14.04)+Xshell 阿里云现在提供的云服务器很好用的,用来编译内核性能也不错.本文介绍最基本的内核编译方法,为了方便,所有操作均在root用户下进行. 如果不是root用户可以使用su命令切换到root用户. 注:使用xshell的时候最好把这一项给关闭了(工具——选项——高级) 一.环境准备 1.准备linux源码和补丁,可以在官网(http://www.kernel.org)上下载,这里我们下载4.5版本. 不过阿里提供了http://mir

Linux内核,文件系统移植过程中出现的一些问题与解决办法

1.bootm地址和load address一样 此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行.因此此时的entry point必须设置为load address + 0x40.如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对. boom address == load address == entry point - 0x40 2.