1.开发环境
这一个部分的git下载链接:git目录
注意:
1.开发板自带的文件不支持dts。
1.1 老版本交叉编译环境
1.交叉编译环境
使用压缩包:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
,解压:
$ sudo tar xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C /
添加环境变量:
$ vim ~/.bash_profile
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin/
$ source ~/.bash_profile
查看是否添加成功,如果能看到如下图片的内容,说明成功添加环境变量。
1.2 uboot
使用uboot压缩包uboot_tiny4412-20130729.tgz
$ tar xvf uboot_tiny4412-20130729.tgz
$ cd uboot_tiny4412/
$ make tiny4412_config
$ make
通过以上命令,可以生成u-boot.bin文件。
在ubuntu系统下烧录u-boot.bin到sd卡上:
注意:确保操作的是SD卡。
$ sudo dd if=/dev/zero of=/dev/sdb bs=1024 count=102400
$ cd sd_fuse/
$ make
$ cd tiny4412/
$ sudo ./sd_fusing.sh /dev/sdb
烧录完成之后,发现串口之后打印OK
就没下文了。
注意,需要打patch,patch文件名为: tiny4412_lioker.patch
打patch方法为:
$ patch -p1 < ../tiny4412_lioker.patch
成功之后,可以看到uboot的打印信息:
1.3 硬件环境
1.启动模式
注意:串口0为调试串口。
1.4 新版本编译环境(支持dts)
1.4.1 交叉编译环境
使用压缩包文件:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar xvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ sudo vi ~/.bashrc
export PATH=$PATH:/home/wityuan/Desktop/tiny4412/arm-2014.05/bin
$ source ~/.bashrc
1.4.2 修改uboot支持dts
1.修改tiny4412/uboot_tiny4412/include/configs/tiny4412.h
其中添加内容:
#define CONFIG_OF_LIBFDT
#define CONFIG_SYS_BOOTMAPSZ (20 << 20)
2.修改arch/arm/config.mk
将其中的内容改为CROSS_COMPILE ?= arm-none-linux-gnueabi-
3.修改uboot中文件内容
1).在common/cmd_bootm.c
中的函数do_bootm()
中添加内容:
int iszImage = 0;
...
iszImage = 1;
goto after_header_check;
...
#if defined(CONFIG_ZIMAGE_BOOT)
after_header_check:
if (iszImage) {
images.os.os = hdr->ih_os;
images.ep = image_get_ep (&images.legacy_hdr_os_copy);
}
//images.os.os = hdr->ih_os;
//images.ep = image_get_ep (&images.legacy_hdr_os_copy);
#endif
4.编译
$ cd sd_fuse/
$ make
$ cd tiny4412/
$ sudo ./sd_fusing.sh /dev/sdb
1.4.3 制作busybox ramdisk
使用压缩包:busybox-1.17.2-20101120.tgz
$ tar xvf busybox-1.17.2-20101120.tgz
$ cd busybox-1.17.2
$ make
$ make install
1.4.4 编译linux-4.4.1代码
采用支持dts
并原生适配tiny4412
的linux-4.4.1
1).下载内核linux-4.4.1
$ tar xzf linux-4.4.1.tar.gz
2).配置内核
$ cd linux-4.4.1/
$ vi Makefile
ARCH ?= arm
CROSS_COMPILE ?= /work/gcc/arm-2014.05/bin/arm-none-linux-gnueabi-
3). 执行命令
$ make exynos_defconfig
4).修改dts文件,如arch/arm/boot/dts/exynos4412-tiny4412.dts
chosen {
stdout-path = &serial_0;
bootargs = "root=/dev/ram0 rw rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc earlyprintk";
};
5).配置内核,支持ramdisk
File systems --->;
<*> Second extended fs support
Device Drivers
SCSI device support --->;
<*> SCSI disk support
Block devices --->;
<*>RAM block device support
(16)Default number of RAM disks
(8192) Default RAM disk size (kbytes) (修改为8M)
General setup --->;
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
6).配置内核,支持tmpfs
File systems --->;
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
7).编译产生uImage
$ make uImage LOADADDR=0x40008000 -j2
8).编译产生dtb
$ make dtbs
最终,arch/arm/boot/dts/
会生成tiny4412
上用的设备树镜像文件exynos4412-tiny4412.dtb
注意:
1.如果编译完成之后,发现kernel会崩溃,其与sdhci_2
相关,则将dtb中与其相关的dtb
先注释掉。
1.4.5 编译dnw-linux工具
下载源码,git 路径
修改Makefile代码:
$ vi src/driver/Makefile
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
obj-m := secbulk.o
$ make
$ ls src/driver/secbulk.ko
$ sudo insmod src/driver/secbulk.ko
验证可以看到:
$ ls /dev/secbulk0
另外,可以看到可执行程序:
$ ls src/dnw/dnw
烧写文件,成功可如下:
1.4.6 制作ramdisk文件系统
1.使用Busybox-1.26.2代码,并解压:
$ tar xvf busybox-1.26.2.tar.bz2
2.开始构建文件系统
1).创建rootfs目录,例如,可以创建路径为/home/wityuan/Desktop/rootfs
2).执行命令
$ cd /home/wityuan/Desktop/rootfs
3).建立常用目录
$ mkdir root bin sbin etc dev usr lib tmp mnt sys proc var
$ mkdir usr/lib usr/bin usr/sbin
4).编译busybox
$ cd busybox-1.26.2/
$ make menuconfig ARCH=arm
5).配置busybox,其中Installation Options
选择/home/wityuan/Desktop/rootfs
Busybox Settings --->
Installation Options --->
Installation Options --->
另外,选择Busybox Settings
为Don't use /usr
Busybox Settings --->
[* ] Don't use /usr
6). 配置busybox
,选择Build BusyBox as a static binary
Busybox Settings---->
Build Options---->
[*]Build BusyBox as a static binary
7).配置busybox
,配置编译工具链arm-none-linux-gnueabi
Busybox Settings---->
Build Options---->
Cross Compiler prefix
8).保存配置,并执行操作:
$ make
$ make install
9).添加dev
下目录
$ cd /home/wityuan/Desktop/rootfs/
$ cd dev
$ sudo mknod -m 666 console c 5 1
$ sudo mknod -m 666 null c 1 3
10).拷贝busybox下目录中examples/bootfloppy/etc
内容到rootfs的etc下。
$ cp /home/wityuan/Desktop/tiny4412/busybox-1.26.2/examples/bootfloppy/etc/* /home/wityuan/Desktop/rootfs/etc/ -raf
11).编辑fstab
文件
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
12).编辑profile
文件
# /etc/profile: system-wide .profile file for the Bourne shells
USER="root"
LOGNAME=$USER
export HOSTNAME=`/bin/hostname`
export USER=root
export HOME=/root
export PS1="[USER@HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
13).修改inittab
文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
14).配置系统的hostname
,在etc
目录下执行命令:
$ mkdir sysconfig
$ cd sysconfig
$ touch HOSTNAME
$ echo tiny4412_yuan > HOSTNAME
如果成功启动linux
,可以看到如下内容:
15).配置init.d/rcS文件
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
#mount -n -t usbfs none /proc/bus/usb
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
ifconfig lo 127.0.0.1
/bin/hostname -F /etc/sysconfig/HOSTNAME
16).修改init.d/rcS文件权限
$ chmod 777 init.d/rcS
17).制作ramdisk文件系统,可以在rootfs同目录下创建文件mkramdiskfs.sh
,内容如下:
#!/bin/bash
rm -rf ramdisk*
sudo dd if=/dev/zero of=ramdisk bs=1k count=8192
sudo mkfs.ext4 -F ramdisk
sudo mkdir -p ./initrd
sudo mount -t ext4 ramdisk ./initrd
sudo cp rootfs/* ./initrd -raf
sudo mknod initrd/dev/console c 5 1
sudo mknod initrd/dev/null c 1 3
sudo umount ./initrd
sudo gzip --best -c ramdisk > ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
rm ramdisk ramdisk.gz initrd -rf
18).执行以上脚本,即可以生成ramdisk.img
文件。
1.4.7 下载uImage,dtb,ramdisk到内存中
1.下载uImage
,uImage文件为:arch/arm/boot/uImage
$ dnw 0x40600000
2.下载ramdisk
$ dnw 0x41000000
3.下载dtb
,dtb
文件为:arch/arm/boot/dts/exynos4412-tiny4412.dtb
$ dnw 0x42000000
4.启动内核
$ bootm 0x40600000 0x41000000 0x42000000
启动成功后,信息如下:
TINY4412 # bootm 0x40600000 0x41000000 0x42000000
## Booting kernel from Legacy Image at 40600000 ...
Image Name: Linux-4.4.1
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4193576 Bytes = 4095 KiB
Load Address: 40008000
Entry Point: 40008000
Verifying Checksum ... OK
## Loading init Ramdisk from Legacy Image at 41000000 ...
Image Name: ramdisk
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 1135203 Bytes = 1108 KiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 42000000
Booting using the fdt blob at 0x42000000
Loading Kernel Image ... OK
OK
## Loading init Ramdisk from Legacy Image at 41000000 ...
Image Name: ramdisk
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 1135203 Bytes = 1108 KiB
Load Address: 00000000
Entr