S5PV210(TQ210)学习笔记——内核移植与文件系统构建

2024-05-13 22:58

本文主要是介绍S5PV210(TQ210)学习笔记——内核移植与文件系统构建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。

内核移植其实很简单,因为内核是linus率领的linux内核开发团队开发并维护的,我们只需要跟我们的平台交叉编译一下即可使用,但是,内核移植也不简单,因为内核移植起见出现任何问题都可能会被卡住,因为内核代码非常庞大,我们无法通读内核代码,下面是我移植期间遇到的各种悲催的问题和解决方案,首先是必备的开发环境:

a) Linux内核代码,版本3.8.3

b) S5PV210开发板(我的是TQ210)

c) HOST环境是WIN7(64位)下安装的Ubuntu虚拟机(12.10)

一 内核编译

从Linux内核网站(kernel.org)下载内核代码、解压并进入内核目录

(1)修改Makefile,将195行和196行改为:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ARCH = arm  
  2. CROSS_COMPILE   ?= arm-linux-  
(2)进行默认配置,进入arch/arm/configs目录,可以发现最接近我们开发板的配置文件是s5pv210_defconfig,故

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make s5pv210_defconfig  
(3)编译内核,如果需要生成zImage则执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make zImage  
如果需要生成uImage则执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make uImage  
(4)用uboot下载并尝试运行,结果是悲剧的,在uboot打印”Starting kernel...“之后就看不到任何输出了,显然,有两种原因:

a. 编译的内核类型错误,比如您的uboot使用的是uImage,而您编译的是zImage。

b. 移植的uboot存在问题,没能正确的拷贝内核到正确的内存地址并启动。

c. 内核存在某些配置,我们没有配置。

经过查看内核配置项知道,内核默认采用的UART1打印调试信息,因此,执行:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make menuconfig  
在出来的对话中依次选择System type => (1) S3C UART to use for low-level messages,在编辑框中将1改为0,然后保存配置并再次编译内核,直接执行make即可,无需make clean。 如果是首次执行make menuconfig会遇到错误,这是因为make menuconfig依赖一个库,这里我忘记名字了,如果是ubuntu可以直接用指令安装的,网上搜一下就可以搞定。

编译完内核之后再次下载并尝试运行,这时,可以看到内核打印的信息了,如果您不幸只看到“Uncompressing Linux... done, booting the kernel.”就没有任何输出了,那么请检查uboot传入的机器码跟内核机器码是否匹配,如果不匹配请修正,然后重新编译运行内核或者uboot,如果修正之后仍然看不到其他输出,那么请检查uboot的bootargs参数,bootargs中必须配置console=ttySAC0,否则也看不到打印信息。

如果没有出现上面的错误,那么您的内核已经可以打印出很多信息,但是由于内核默认没有提供对Nand或网卡的支持,无法挂接文件系统,所以仍然无法正常运行。为了能使内核进入控制台,为后面的驱动开发提供环境,我们先制作文件系统,然后来移植网卡驱动,让内核NFS方式挂接文件系统,然后我们就可以开发其他驱动了,如Nand、LCD、声卡等等。

二 构建文件系统

其实构建文件系统还是比较简单的,注意几个地方,然后按部就班的来就可以了。

(1)创建根文件系统目录结构,可以使用如下脚本:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #!/bin/sh  
  2. echo "------Create rootfs directons start...--------"  
  3. mkdir rootfs  
  4. cd rootfs  
  5. echo "--------Create root,dev....----------"  
  6. mkdir root dev etc boot tmp var sys proc lib mnt home usr   
  7. mkdir etc/init.d etc/rc.d etc/sysconfig  
  8. mkdir usr/sbin usr/bin usr/lib usr/modules  
  9. echo "make node in dev/console dev/null"  
  10. sudo mknod -m 600 dev/console c 5 1  
  11. sudo mknod -m 600 dev/null  c 1 3  
  12. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  13. mkdir var/lib var/lock var/run var/tmp  
  14. chmod 1777 tmp  
  15. chmod 1777 var/tmp  
  16. echo "-------make direction done---------"  

在这里我将脚本命名为mkrootfs.sh,接下来给脚本加可执行权限(即chmod a+x mkrootfs)并运行脚本。我的脚本是在/nfsroot目录下运行的,所以我的根文件系统的根目录为/nfsroot/rootfs,后面均以该目录为例阐述。

(2)编译Busybox

到Busybox下载最新版的Busybox源码,我是用的是1.21.0版本,下载完后解压并进入busybox目录,首先是配置busybox

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make menuconfig  

配置菜单跟配置内核时的差不多,依次进入Busybox Settings => Build Options => Cross Compiler prefix (NEW),设置为编译器的前缀,我的是arm-linux-。网上有些朋友还推荐选择Busybox Settings => Build Options => Build BusyBox as a static binary (no shared libs),但是如果我们正确拷贝编译器了运行库的话,不设置也可以。现在可以编译Busybox了,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make  

编译过程很顺利,我这里没有遇到任何错误,接下来将编译好的Busybox安装到/nfsroot/rootfs就可以了,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make CONFIG_PREFIX=/nfsroot/rootfs install  

(3)拷贝编译器运行库

我的编译器是4.5.1版本的,拷贝arm-none-linux-gnueabi/sys-root/lib的所有动态库到/nfsroot/rootfs/lib下,为了不拷贝连接,应该加上”-d"选项,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cp *so* /nfsroot/rootfs/lib -d  

同样拷贝arm-none-linux-gnueabi/sys-root/usr/lib下的所有动态库到/nfsroot/rootfs/usr/lib下,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cp *so* /nfsroot/rootfs/usr/lib -d  

(4)构建etc目录

在etc目录下创建Inittab文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ::sysinit:/etc/init.d/rcS  
  2. console::askfirst:-/bin/sh  
  3. ::restart:/sbin/init  
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  
  6. ::shutdown:/sbin/swapoff -a  

在etc/init.d/目录下创建rcS文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. echo "----------mount all.........."  
  2. mount -a  
  3. echo "----------Starting mdev......"  
  4. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  5. mdev -s  
  6. /bin/hostname -F /etc/sysconfig/HOSTNAME  

为inittab和rcS文件添加可执行权限

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. chmod a+x inittab  
  2. chmod a+x rcS  

在etc目录下创建fstab文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #evice mount-point type       option       dump   fsck   order  
  2. proc /proc proc defaults 0 0  
  3. none /tmp ramfs defaults 0 0  
  4. mdev /dev ramfs defaults 0 0  
  5. sysfs /sys sysfs defaults 0 0  

在etc目录下创建profile文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. PATH=/bin:/sbin:/usr/bin:/usr/sbin    
  2. export PATH    
  3. #set hostname    
  4. HOSTNAME='/bin/hostname'    
  5. export HOSTNAME    
  6. # Set PS1    
  7. PS1='[\u@\h \W]\$'  
  8. export PS1  

拷贝主机/etc目录下的passwd和group文件到etc目录下。

(5) 设置HOSTNAME文件

在etc/sysconfig目录下创建HOSTNAME文件,在文件中写入主机名,我这里写的是bruce。

(6) 安装内核modules

进入内核源码目录,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make modules  

待编译完成后安装modules,执行指令

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs  

到这,根文件系统就构建完成了.

三 设置uboot启动参数

我的nfs根目录为/nfsroot,我的根文件系统目录是在该目录之下的,即/nfsroot/rootfs目录,故uboot启动参数设置如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. noinitrd console=ttySAC0 root=<主机IP>:/nfsroot/rootfs rw ip=<开发板IP>:<主机IP>:<网关>:<子网掩码>::eth0:off init=/linuxrc  

需要注意的是,所有的冒号":"都不可省略。

四  网卡驱动移植(DM9000)

选择网卡移植是因为网卡驱动相对较为简单,对于DM9000就更加简单了,因为内核本身提供了DM9000的驱动程序,但是没有针对开发板进行管教配置,因此,我们配置下开发板相关的东西即可完成网卡驱动的移植。打开arch/arm/mach-s5pv210/mach-smdkv210.c文件,并作以下修改:

(1) 修改smdkv210_dm9000_resources定义如下

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static struct resource smdkv210_dm9000_resources[] = {   
  2.     [0] = {   
  3.         .start = 0x88000000,  
  4.         .end = 0x88000000 + 3,  
  5.         .flags = IORESOURCE_MEM,  
  6.     },    
  7.     [1] = {   
  8.         .start = 0x88000000 + 4,  
  9.         .end = 0x88000000 + 4 + 3,  
  10.         .flags = IORESOURCE_MEM,  
  11.     },    
  12.     [2] = {   
  13.         .start = IRQ_EINT(10),  
  14.         .end = IRQ_EINT(10),  
  15.         .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,  
  16.     }     
  17. };  

(2) 修改smdkv210_dm9000_init函数如下

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static void __init smdkv210_dm9000_init(void)  
  2. {  
  3.     unsigned long* srom_bw = ioremap(0xE8000000, 4);   
  4.     unsigned long* srom_bc1 = ioremap(0xE8000004, 4);   
  5.   
  6.     *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));  
  7.     *srom_bw &= ~(0xf << 4);   
  8.     *srom_bw |= (1<<4)|(1<<5);  
  9.   
  10.     gpio_request(S5PV210_MP01(1), "nCS1");  
  11.     s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));  
  12.     gpio_free(S5PV210_MP01(1));  
  13.   
  14.     iounmap(srom_bw);  
  15.     iounmap(srom_bc1);  
  16. }  

这样,就完成了DM9000网卡驱动的移植,其实这样修改是有逻辑的,根据TQ210的原理图可知DM9000连接的片选时nCS1,也就是网卡是接在来ROM控制器的BANK1上。


根据S5PV210的内存映射表可以看出,SROMC的BANK1地址空间为0x88000000~0x8FFFFFFF,故当CPU寻址该范围内的地址空间时才会使能片选nCS1。所以,我们采用的是0x88000000地址。


另外,从TQ210原理图的DM9000部分还可以看到,DM9000使用的是外部中断10,故将中断号修改为10号。

最后需要说明的是smdkv210_dm9000_init函数的修改,这是因为DM9000的数据访问、命令发送等是按照一定时序工作的,而DM9000接再SROMC上,因此需要配置SROMC时序,使其可以正确驱动DM9000,关于时序的详细配置我还没研究,不过韦东山老师的第二期视频中讲述了DM9000的驱动移植,也讲了时序配置,需要的话可以参考。

五 挂接文件系统

我们现在配置好了网卡驱动,还需要对内核稍作配置才能使内核支持网络文件系统挂载,具体的可以参考以下配置。

(1) 配置网络支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [*] Networking support  --->  
  2.     Networking options  --->  
  3.         <*> Packet socket   
  4.         <*> Unix domain sockets  
  5.         [*] TCP/IP networking  
  6.         [*]   IP: multicasting  
  7.         [*]   IP: kernel level autoconfiguration   
  8.         [*]     IP: DHCP support  
  9.         [*]     IP: BOOTP support  
  10.         [*]     IP: RARP support  
  11.         [*]   IP: multicast routing  
  12.           

(2) 配置网卡设备支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Device Drivers  --->  
  2.     [*] Network device support  --->   
  3.         [*]   Ethernet driver support  --->  
  4.             <*>   DM9000 support  


(3) 配置网络文件系统支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. File systems  --->   
  2.     [*] Network File Systems  --->   
  3.         <*>   NFS client support   
  4.         <*>     NFS client support for NFS version 2  
  5.         <*>     NFS client support for NFS version 3   
  6.         [*]       NFS client support for the NFSv3 ACL protocol extension  
  7.         <*>     NFS client support for NFS version 4  
  8.         [*]   Root file system on NFS  

配置完以上三项后保存配置,然后再次编译内核,直接执行make指令即可。

这时,重新下载内核测试运行,没有意外的话现在内核已经可以正常工作了,如果不幸的遇到了问题,那么问题应该是NFS服务器配置的问题,ubuntu下配置NFS服务器很简单

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo apt-get install nfs-kernel-server  

然后以根权限打开/etc/exports文件,我的NFS根目录为/nfsroot,故,我设置export为

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /nfsroot/ *(rw,sync,no_root_squash)  

设置完成之后需要重启NFS服务,ubuntu下执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo service nfs-kernel-server restart  

重启的时候会看到一些警告,如下图


但是上述警告不影响使用。反之,如果设置为no_subtree_check,虽然系统可以正常挂载,但是无法进行创建文件等写操作,也就是说,挂载的文件系统是只读的。最后还要修改下/nfsroot的权限,为了以后使用方便。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. chmod a+x /nfsroot -R  

到这里,基于TQ210的内核移植已经初步完成了,接下来我们就可以进行驱动开发了。

六 问题总结

我在配置过程中遇到了很多问题,现在稍作总结

(1) 串口中断打印完Starting kernel...之后就没有任何输出了

配置内核,指定调试信息输出端口为UART0,文中讲到了详细配置。

(2) 解压完内核之后没有任何输出了

a.检查bootargs环境变量设置是否正确,必须设置console=ttySAC0

b.检查uboot传递的机器码根内核是否对应

c.检查uboot传给内核的taglist是否正确

(3) 内核无法挂接到NFS文件系统

a. 正确移植DM9000网卡驱动

b. 配置内核的网络部分、网卡设备和文件系统中的网络文件系统

c. 确认NFS服务器的配置是否正确,用另外其他linux或已经移植好系统的linux进行测试(mount -o nolock xx.xx.xx.xx:/nfsroot/rootfs)。

(4) 文件系统挂接成功,无法执行/linuxrc

a. 检查NFS配置文件,最好以NFSv2方式配置,内核不支持的话会出现问题。

b. 最好以文中推荐的方式进行NFS服务器配置。

c. 配置完成之后需要重启NFS服务或者是重启系统。

七 其它问题

如果您在移植过程中出现了其他问题欢迎留言讨论。


本文链接:http://blog.csdn.net/girlkoo/article/details/8719828

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make uImage  
(4)用uboot下载并尝试运行,结果是悲剧的,在uboot打印”Starting kernel...“之后就看不到任何输出了,显然,有两种原因:

a. 编译的内核类型错误,比如您的uboot使用的是uImage,而您编译的是zImage。

b. 移植的uboot存在问题,没能正确的拷贝内核到正确的内存地址并启动。

c. 内核存在某些配置,我们没有配置。

经过查看内核配置项知道,内核默认采用的UART1打印调试信息,因此,执行:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make menuconfig  
在出来的对话中依次选择System type => (1) S3C UART to use for low-level messages,在编辑框中将1改为0,然后保存配置并再次编译内核,直接执行make即可,无需make clean。 如果是首次执行make menuconfig会遇到错误,这是因为make menuconfig依赖一个库,这里我忘记名字了,如果是ubuntu可以直接用指令安装的,网上搜一下就可以搞定。

编译完内核之后再次下载并尝试运行,这时,可以看到内核打印的信息了,如果您不幸只看到“Uncompressing Linux... done, booting the kernel.”就没有任何输出了,那么请检查uboot传入的机器码跟内核机器码是否匹配,如果不匹配请修正,然后重新编译运行内核或者uboot,如果修正之后仍然看不到其他输出,那么请检查uboot的bootargs参数,bootargs中必须配置console=ttySAC0,否则也看不到打印信息。

如果没有出现上面的错误,那么您的内核已经可以打印出很多信息,但是由于内核默认没有提供对Nand或网卡的支持,无法挂接文件系统,所以仍然无法正常运行。为了能使内核进入控制台,为后面的驱动开发提供环境,我们先制作文件系统,然后来移植网卡驱动,让内核NFS方式挂接文件系统,然后我们就可以开发其他驱动了,如Nand、LCD、声卡等等。

二 构建文件系统

其实构建文件系统还是比较简单的,注意几个地方,然后按部就班的来就可以了。

(1)创建根文件系统目录结构,可以使用如下脚本:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #!/bin/sh  
  2. echo "------Create rootfs directons start...--------"  
  3. mkdir rootfs  
  4. cd rootfs  
  5. echo "--------Create root,dev....----------"  
  6. mkdir root dev etc boot tmp var sys proc lib mnt home usr   
  7. mkdir etc/init.d etc/rc.d etc/sysconfig  
  8. mkdir usr/sbin usr/bin usr/lib usr/modules  
  9. echo "make node in dev/console dev/null"  
  10. sudo mknod -m 600 dev/console c 5 1  
  11. sudo mknod -m 600 dev/null  c 1 3  
  12. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  13. mkdir var/lib var/lock var/run var/tmp  
  14. chmod 1777 tmp  
  15. chmod 1777 var/tmp  
  16. echo "-------make direction done---------"  

在这里我将脚本命名为mkrootfs.sh,接下来给脚本加可执行权限(即chmod a+x mkrootfs)并运行脚本。我的脚本是在/nfsroot目录下运行的,所以我的根文件系统的根目录为/nfsroot/rootfs,后面均以该目录为例阐述。

(2)编译Busybox

到Busybox下载最新版的Busybox源码,我是用的是1.21.0版本,下载完后解压并进入busybox目录,首先是配置busybox

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make menuconfig  

配置菜单跟配置内核时的差不多,依次进入Busybox Settings => Build Options => Cross Compiler prefix (NEW),设置为编译器的前缀,我的是arm-linux-。网上有些朋友还推荐选择Busybox Settings => Build Options => Build BusyBox as a static binary (no shared libs),但是如果我们正确拷贝编译器了运行库的话,不设置也可以。现在可以编译Busybox了,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make  

编译过程很顺利,我这里没有遇到任何错误,接下来将编译好的Busybox安装到/nfsroot/rootfs就可以了,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make CONFIG_PREFIX=/nfsroot/rootfs install  

(3)拷贝编译器运行库

我的编译器是4.5.1版本的,拷贝arm-none-linux-gnueabi/sys-root/lib的所有动态库到/nfsroot/rootfs/lib下,为了不拷贝连接,应该加上”-d"选项,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cp *so* /nfsroot/rootfs/lib -d  

同样拷贝arm-none-linux-gnueabi/sys-root/usr/lib下的所有动态库到/nfsroot/rootfs/usr/lib下,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cp *so* /nfsroot/rootfs/usr/lib -d  

(4)构建etc目录

在etc目录下创建Inittab文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ::sysinit:/etc/init.d/rcS  
  2. console::askfirst:-/bin/sh  
  3. ::restart:/sbin/init  
  4. ::ctrlaltdel:/sbin/reboot  
  5. ::shutdown:/bin/umount -a -r  
  6. ::shutdown:/sbin/swapoff -a  

在etc/init.d/目录下创建rcS文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. echo "----------mount all.........."  
  2. mount -a  
  3. echo "----------Starting mdev......"  
  4. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  5. mdev -s  
  6. /bin/hostname -F /etc/sysconfig/HOSTNAME  

为inittab和rcS文件添加可执行权限

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. chmod a+x inittab  
  2. chmod a+x rcS  

在etc目录下创建fstab文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #evice mount-point type       option       dump   fsck   order  
  2. proc /proc proc defaults 0 0  
  3. none /tmp ramfs defaults 0 0  
  4. mdev /dev ramfs defaults 0 0  
  5. sysfs /sys sysfs defaults 0 0  

在etc目录下创建profile文件,内容如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. PATH=/bin:/sbin:/usr/bin:/usr/sbin    
  2. export PATH    
  3. #set hostname    
  4. HOSTNAME='/bin/hostname'    
  5. export HOSTNAME    
  6. # Set PS1    
  7. PS1='[\u@\h \W]\$'  
  8. export PS1  

拷贝主机/etc目录下的passwd和group文件到etc目录下。

(5) 设置HOSTNAME文件

在etc/sysconfig目录下创建HOSTNAME文件,在文件中写入主机名,我这里写的是bruce。

(6) 安装内核modules

进入内核源码目录,执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make modules  

待编译完成后安装modules,执行指令

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. make modules_install INSTALL_MOD_PATH=/nfsroot/rootfs  

到这,根文件系统就构建完成了.

三 设置uboot启动参数

我的nfs根目录为/nfsroot,我的根文件系统目录是在该目录之下的,即/nfsroot/rootfs目录,故uboot启动参数设置如下

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. noinitrd console=ttySAC0 root=<主机IP>:/nfsroot/rootfs rw ip=<开发板IP>:<主机IP>:<网关>:<子网掩码>::eth0:off init=/linuxrc  

需要注意的是,所有的冒号":"都不可省略。

四  网卡驱动移植(DM9000)

选择网卡移植是因为网卡驱动相对较为简单,对于DM9000就更加简单了,因为内核本身提供了DM9000的驱动程序,但是没有针对开发板进行管教配置,因此,我们配置下开发板相关的东西即可完成网卡驱动的移植。打开arch/arm/mach-s5pv210/mach-smdkv210.c文件,并作以下修改:

(1) 修改smdkv210_dm9000_resources定义如下

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static struct resource smdkv210_dm9000_resources[] = {   
  2.     [0] = {   
  3.         .start = 0x88000000,  
  4.         .end = 0x88000000 + 3,  
  5.         .flags = IORESOURCE_MEM,  
  6.     },    
  7.     [1] = {   
  8.         .start = 0x88000000 + 4,  
  9.         .end = 0x88000000 + 4 + 3,  
  10.         .flags = IORESOURCE_MEM,  
  11.     },    
  12.     [2] = {   
  13.         .start = IRQ_EINT(10),  
  14.         .end = IRQ_EINT(10),  
  15.         .flags = IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHLEVEL,  
  16.     }     
  17. };  

(2) 修改smdkv210_dm9000_init函数如下

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static void __init smdkv210_dm9000_init(void)  
  2. {  
  3.     unsigned long* srom_bw = ioremap(0xE8000000, 4);   
  4.     unsigned long* srom_bc1 = ioremap(0xE8000004, 4);   
  5.   
  6.     *srom_bc1 = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));  
  7.     *srom_bw &= ~(0xf << 4);   
  8.     *srom_bw |= (1<<4)|(1<<5);  
  9.   
  10.     gpio_request(S5PV210_MP01(1), "nCS1");  
  11.     s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2));  
  12.     gpio_free(S5PV210_MP01(1));  
  13.   
  14.     iounmap(srom_bw);  
  15.     iounmap(srom_bc1);  
  16. }  

这样,就完成了DM9000网卡驱动的移植,其实这样修改是有逻辑的,根据TQ210的原理图可知DM9000连接的片选时nCS1,也就是网卡是接在来ROM控制器的BANK1上。


根据S5PV210的内存映射表可以看出,SROMC的BANK1地址空间为0x88000000~0x8FFFFFFF,故当CPU寻址该范围内的地址空间时才会使能片选nCS1。所以,我们采用的是0x88000000地址。


另外,从TQ210原理图的DM9000部分还可以看到,DM9000使用的是外部中断10,故将中断号修改为10号。

最后需要说明的是smdkv210_dm9000_init函数的修改,这是因为DM9000的数据访问、命令发送等是按照一定时序工作的,而DM9000接再SROMC上,因此需要配置SROMC时序,使其可以正确驱动DM9000,关于时序的详细配置我还没研究,不过韦东山老师的第二期视频中讲述了DM9000的驱动移植,也讲了时序配置,需要的话可以参考。

五 挂接文件系统

我们现在配置好了网卡驱动,还需要对内核稍作配置才能使内核支持网络文件系统挂载,具体的可以参考以下配置。

(1) 配置网络支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [*] Networking support  --->  
  2.     Networking options  --->  
  3.         <*> Packet socket   
  4.         <*> Unix domain sockets  
  5.         [*] TCP/IP networking  
  6.         [*]   IP: multicasting  
  7.         [*]   IP: kernel level autoconfiguration   
  8.         [*]     IP: DHCP support  
  9.         [*]     IP: BOOTP support  
  10.         [*]     IP: RARP support  
  11.         [*]   IP: multicast routing  
  12.           

(2) 配置网卡设备支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Device Drivers  --->  
  2.     [*] Network device support  --->   
  3.         [*]   Ethernet driver support  --->  
  4.             <*>   DM9000 support  


(3) 配置网络文件系统支持

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. File systems  --->   
  2.     [*] Network File Systems  --->   
  3.         <*>   NFS client support   
  4.         <*>     NFS client support for NFS version 2  
  5.         <*>     NFS client support for NFS version 3   
  6.         [*]       NFS client support for the NFSv3 ACL protocol extension  
  7.         <*>     NFS client support for NFS version 4  
  8.         [*]   Root file system on NFS  

配置完以上三项后保存配置,然后再次编译内核,直接执行make指令即可。

这时,重新下载内核测试运行,没有意外的话现在内核已经可以正常工作了,如果不幸的遇到了问题,那么问题应该是NFS服务器配置的问题,ubuntu下配置NFS服务器很简单

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo apt-get install nfs-kernel-server  

然后以根权限打开/etc/exports文件,我的NFS根目录为/nfsroot,故,我设置export为

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /nfsroot/ *(rw,sync,no_root_squash)  

设置完成之后需要重启NFS服务,ubuntu下执行

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sudo service nfs-kernel-server restart  

重启的时候会看到一些警告,如下图


但是上述警告不影响使用。反之,如果设置为no_subtree_check,虽然系统可以正常挂载,但是无法进行创建文件等写操作,也就是说,挂载的文件系统是只读的。最后还要修改下/nfsroot的权限,为了以后使用方便。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. chmod a+x /nfsroot -R  

到这里,基于TQ210的内核移植已经初步完成了,接下来我们就可以进行驱动开发了。

六 问题总结

我在配置过程中遇到了很多问题,现在稍作总结

(1) 串口中断打印完Starting kernel...之后就没有任何输出了

配置内核,指定调试信息输出端口为UART0,文中讲到了详细配置。

(2) 解压完内核之后没有任何输出了

a.检查bootargs环境变量设置是否正确,必须设置console=ttySAC0

b.检查uboot传递的机器码根内核是否对应

c.检查uboot传给内核的taglist是否正确

(3) 内核无法挂接到NFS文件系统

a. 正确移植DM9000网卡驱动

b. 配置内核的网络部分、网卡设备和文件系统中的网络文件系统

c. 确认NFS服务器的配置是否正确,用另外其他linux或已经移植好系统的linux进行测试(mount -o nolock xx.xx.xx.xx:/nfsroot/rootfs)。

(4) 文件系统挂接成功,无法执行/linuxrc

a. 检查NFS配置文件,最好以NFSv2方式配置,内核不支持的话会出现问题。

b. 最好以文中推荐的方式进行NFS服务器配置。

c. 配置完成之后需要重启NFS服务或者是重启系统。

七 其它问题

如果您在移植过程中出现了其他问题欢迎留言讨论。


本文链接:http://blog.csdn.net/girlkoo/article/details/8719828

这篇关于S5PV210(TQ210)学习笔记——内核移植与文件系统构建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987051

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss