<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
一.ubuntu 下minicom 的使用
1.sudo apt -get install minicom
2.sudo minicom -s
a. 串口COM1 对应ttyS0, COM2 对应ttyS1 ,usb 转串口对应ttyUSB0
插上usbserials 设备后,在/dev 下应该会有设备文件ttyUSB0
b. 其他设置参考网上.
此时,minicom 可以用来显示信息了
3.sudo apt -get install lrzsz
此时,可以用来传输文件了: 例如 load flash kernel x
二. 编译工具安装
1. 编译bootloader 用2.95.3 版本. 下载,安装在某一目录,( 设置环境变量)
2. 编译2 。6 以上内核用3.4.1 版本. 下载,安装在某一目录,( 设置环境变量)
三.tftp 服务安装与配置
1.sudo apt -get install tftp // 客户端
sudo apt -get install tftpd // 服务器端
sudo apt -get install openbsd-inetd // 守护进程,用来监听客户端请求
2.gedit /etc/inetd.conf
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot # /tftpboot 为tftp 主目录
3.service openbsd-inetd restart
4. 在跟目录新建tftpboot 文件夹, 并设置可读写权限, 至此tftp 服务配置完成
5. 测试手段查阅网络
四.NFS 服务配置
1.sudo apt-get install portmap nfs-common nfs-kernel-server
2. 修改/etc/exports 文件, 新增: /nfsboot * (rw,sync,no_root_squash)
3. sudo service portmap restart
sudo service nfscomnom restart
sudo service nfs-kernel-server restart
4. 在客户端可以mount /nfsboot 文件夹了.
测试手段查阅网络: 例如:mount -t nfs 10.96.15.168:/nfsboot /mnt
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
五. 内核中的 Kconfig & Makefile
1.arch/arm/configs/smdk2410_defconfig 是官方配好的针对S3C2410 的配置文件
2.Kconfig 组织成编译内核时的菜单( 选项) ,配置好内核后在内核主目录下产生.config 文件,Makefile 根据.config 文件编译内核
关于Kconfig:
如果是arm 的话,根据arm 文件夹内的Kconfig 从上到下依次包括别个文件夹内的Kconfig 对应的组成配置内核菜单( 菜单和选项) ,最终还会根据默认的配置文件来决定显示输出某些菜单和选项,类似于Makefile 。
menu 关键字产生 菜单 ,并非选项.
config symbol 关键字根据symbol 是否定义决定在对应菜单下产生选项
bool“xxx” 形变量只有“编译”和“移除”两种
tristate “xxx” 形变量为3 态,包括“模块”
depends on 指此菜单的出现是否依赖于另一个定义。
如果此 XXX 变量在配置内核时被选中或模块形式,对应的 symbol 在 .config 文件中就会成 y 或者 M.
同文件夹的 Makefile 中的 obj-$(config_symbol) += abc.o 会根据 symbol 来决定是否编译 abc.o, 而 abc.o 则有 Makefile 同文件夹中的 abc.c 而来
六.VIVI 编译
1. 在网上下 VIVI 纯净版,解压到 /usr/local/arm, 生成 vivi 文件夹
2. 修改-》 LINUX_INCLUDE_DIR =/usr/local/arm/linux-2.6.14.1/include
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
3. 在 vivi/arch/s3c2410 里修改 smdk.c 中的 NANDFLASH 分区信息,如下:
mtd_partition_t default_mtd_partitions[] = {
{
name: "vivi",
offset: 0,
size: 0x00020000,
flag: 0
}, {
name: "param",
offset: 0x00020000,
size: 0x00010000,
flag: 0
}, {
name: "kernel",
offset: 0x00030000,
size: 0x001d0000,
flag: 0
}, {
name: "root",
offset: 0x00200000,
size: 0x00200000,
flag: 4
},{
name: "program",
offset: 0x00400000,
size: 0x03a00000,
flag: 0
}
};
char linux_cmd[] = "noinitrd root=/dev/mtdblock/3 init=/linuxrc console=ttySAC0";
4.shell 里输入: sudo make vivi 编译后会在 vivi 根目录下声称 vivi 的二进制文件 .
七. 内核( 2.6.14 版本)编译
1. 下载内核源码。
2. 过程不叙述,见《 linux 移植》,但 MTD 的分区应和 VIVI 分区保持一致,否则系统将无法从 MTD 分区里找到系统或根文件。
#make menuconfig
#make dep //检查依赖关系
#make clean //清理以前编译出来的一些文件
#make bImage
#make modules
#make modules_install //生成在/lib/modules/xxx,一些模块,该文件夹可以直接复制到开发板中,或编译进文件系统
如果是本机内核编译,则继续进行下面操作
#/sbin/depmod -a //创建模块链接
#make install //
#mkinitramfs -o /boot/initrd-2.6.xx 2.6.xx
#update-initramfs -c -k 2.6.xx //把l/lib/modules/xxx下一些启动会用到的模块加载到initramfs
八. 根文件制作
由于开发板自带根文件系统是 busybox0.6 版本,不支持 insmod, 因此自己重新制作了根文件系统 .
交叉编译器: arm-linux-gcc-3.3.2.tar.bz2
根文件系统: busybox-1.1.3
1.mkdir /usr/local/arm/rootfs
2.mkdir bin dev etc home lib mnt proc sbin sys tmp var usr
3. 再建立 etc 下的 init.d 文件夹。
4. 准备启动所需的文件: linuxrc 、 rcS 、 inittab 、 fstab 四个文件;
linuxrc 文件:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/empty
#/bin/mount -t usbdevfs none /proc/bus/usb
exec /sbin/init
rcS 文件:
#!/bin/sh
/bin/mount -a
这两个文件生成后,应该使其具有执行的权限,可使用 chmod 775 linuxrc rcS 来修改, linuxrc 应该放在 rootfs 根目录, rcS 应该放在 rootfs/etc/init.d/ 目录。
inittab 文件:
# This is run first except when booting
::sysinit:/etc/init.d/rcS
# Start an "askfirst" shell on the console
#::askfirst:-/bin/bash
::askfirst:-/bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
fstab 文件:
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
这两个文件应该放在 rootfs/etc/ 目录,应该注意其权限问题。
如果使用 linux 2.6.xx 内核,应该实现创建节点 console 、 null 。转到 rootfs/dev/ 目录来创建:
sudo mknod console c 5 1
sudo mknod null c 1 3
否则就会提示“ Warning: unable to open an initial console.
Kernel panic - not syncing: Attempted to kill init!” 的类似错误。
5. 在 busybox-1.1.3 文件夹:
1.make menuconfig // 注意需要够选的选项,可查网上
2.make TARGET_ARCH=arm
3.make PREFIX=/usr/local/arm/rootfs all install
会在 /usr/local/arm/rootfs 生成 bin , sbin , usr , linuxrc 文件。
注:网上说要用自己的 linuxrc 代替 busybox 生成的 linuxrc ,但启动时系统无法找到 linuxrc. 这里直接采用 busybox 自己生成的 linuxrc 。
cd /usr/local/arm/
使用 mkcramfs 工具: mkcramfs rootfs rootfs.cramfs
九.CS8900a 网卡驱动
1. 拷贝文件 cs8900.c cs8900.h 到 linux2.6.14.1/drivers/net/arm
2. 修改 drivers/net/arm/Kconfig
加入以下内容:
config CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help
3. 修改 drivers/net/arm/Makefile, 加入以下内容 obj-$(CONFIG_CS8900) += cs8900.o
4. 在 include/asm-arm/mach-s3c2410 中创建 regs-cs8900.h , 内容如下
#ifndef _INCLUDE_REGS_CS8900_H
#define _INCLUDE_REGS_CS8900_H
# include <linux/config.h>
#define Psmdk2410_eth_io 0x19000000
#define vSMDK2410_ETH_IO 0xE00 00000
#define SMDK2410_ETH_IRQ IRQ_EINT9
#endif // _INCLUDE_REGS_CS8900_H
注 : 如果是其他开发板 , 这些参数未必相同 .
5. 在 arch/arm/mach-s3c2410/mach-smdk2410.c 中加入头文件:
# include <asm/arch/regs-cs8900.h>
并加入地址转换信息 , 找到 smdk2410_iodesc[] 结构数组 , 加入:
{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE},
>>>>>>>>>>> 至此编译并烧录内核,发现找不到网卡
6. 在 cs8900.c 中加入语句:
#define CONFIG_ARCH_SMDK2410 1
#ifdef CONFIG_ARCH_SMDK2410
#include <asm-arm/arch-s3c2410/regs-cs8900.h>
#endif
>>>>>>>>>> 至此编译并烧录内核 , 启动信息中能找到网卡 , 但是 eth0: incorrect signature 错误
7. 在 cs8900.c 中加入语句:
#include <asm-arm/arch-s3c2410/regs-mem.h> // 定义下面 2 个寄存器
找到 cs8900_probe 函数中的 mem_set ,在下面加入:
__raw_writel(0x2211d110,S3C2410_BWSCON);
__raw_writel(0x1f7c,S3C2410_BANKCON3);
>>>>>>>> 至此编译并烧录内核 , 网卡正常启动 , 设置 IP 可以 ping 通主机 .
十. 开发板 NFS
重新编译内核 ,, 选中如下配置
File systems
Network File Systems --->
[*] NFS file system support
[*]Provide NFSv3 client support
[*] Provide client support for the NFSv3 ACL protocol extension
[*]Provide NFSv4 client support (EXPERIMENTAL)
[*]Allow direct I/O on NFS files (EXPERIMENTAL)
[ ] NFS server support
[*] Root file system on NFS