内核编译与移植(三)

在硕数的核心板上,使用的是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网卡就可不要),这取决于你开发板上的资源以及你的应用需求,这里就不做讨论了,有兴趣的可自己慢慢研究。

posted @ 2020-02-11 00:06  fxzq  阅读(368)  评论(0编辑  收藏  举报