试从零构建F1C100s开发环境【转】
本帖是尝试从零开始构建F1C100s开发环境,一步一步操作,记录开发流程方便新人爬楼,并非一下子写完,将包含一下内容:
1、使用虚拟机安装ubuntu
2、根据荔枝派教程搭建开发环境
3、编译uboot
4、编译linux内核
5、编译根文件系统
6、打包出烧写spi flash的bin文件
7、烧写验证
8、编译裸机程序
1、使用虚拟机安装ubuntu
链接:获取ubuntu
链接:获取虚拟机应用
1.1 新建虚拟机向导
(1) [勾选]安装程序光盘映像文件
(2) 个性化linux:填写自己的linux机器名称,用户名,密码,确认密码
我这里填写为:book,book,linjie,linjie
(3) 选择安装位置
(4) 根据自己情况,分配磁盘容量
我这里分配32GB
(5) 根据自己机器性能,自定义硬件
内存:
处理器:
网络适配器:
(1)桥接模式,ubuntu相当于一台独立的电脑,可以通过路由器连接外网。
(2)NAT模式:ubuntu连接windows的网络,可通过windows电脑分享的网络,连接外网。
(6) 进入ubuntu安装界面,按照向导随意配置。
1.2 安装一些便捷的工具
(1) 切换到root
sudo -i
(2) 更新源:
apt-get update
(3) 安装ssh服务器
apt-get install ssh
(4) 命令行输入观察ubuntu的ip:
ifconfig (没这个工具的话apt-get install net-tools)
或
ip -a
(5) windows端下载远程工具:putty
链接:获取putty
(6) 使用putty登陆ubuntu验证ssh服务是否正常
2 根据荔枝派教程搭建开发环境
链接:荔枝派nano的教程链接
2.1 安装交叉编译工具链
(1)新建一个文件夹存放f1c100s的开发工具
mkdir f1c100s
进入该文件夹
cd f1c100s
(2)获取交叉编译工具链
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
(3)解压
tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
(4)安装
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/
(5)修改环境变量
-->1.安装vim:
sudo apt-get install vim
-->2.使用vim编辑
sudo vim /etc/bash.bashrc
-->3.在文件末尾 添加以下内容:
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
-->4.使路径生效
source /etc/bash.bashrc
-->5.测试
arm-linux-gnueabi-gcc -v
3 编译uboot
-->安装git工具
sudo apt-get install git
3.1 获取uboot源码
荔枝派官方教程里,源码位于git站上,因为国内git过于慢,建议使用下载工具打包下载。
(1)打开链接 https://github.com/Lichee-Pi/u-boot
(2)选择分支:点击Branch->nano-lcd800480
(3)使用下载工具打包下载
3.2 uboot.zip解压
(1)新建文件夹uboot
mkdir uboot
(2)解压zip文件
unzip uboot.zip
(3)进入目录
cd u-boot
(4)查看分支
git branch -a
(5)切换到 Nano 分支
git checkout nano-v2018.01
(6)编译uboot
-->1 安装make
sudo apt install make
-->2 使用nano配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
出现错误提示:
①recipe for target 'scripts/basic/fixdep' failed
②/bin/sh: 1: cc: not found
安装如下工具:
sudo apt-get install libncurses5-dev
sudo apt-get install gcc
继续配置命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
-->3 体验可视化配置
make ARCH=arm menuconfig
-->4 编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
如果你的CPU支持8线程,则-j4可以修改为-j8,提高编译速度。
-----------------------------------------------
出现错误:
①recipe for target 'scripts/dtc' failed
②recipe for target 'scripts' failed
-----------------------------------------------
安装如下工具:
apt-get install device-tree-compiler
-----------------------------------------------
继续编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
-----------------------------------------------
依然出现错误,瞎安装:
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install swig python-dev python3-dev
-----------------------------------------------
继续编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
居然好了。
得到u-boot-sunxi-with-spl.bin文件。
4 编译linux内核
4.1 获取linux内核源码
(1)打开链接:https://github.com/Icenowy/linux.git
(2)选择分支:点击Branch->f1c100s-480272
(3)打包下载
(4)传到ubuntu中,解压
unzip f1c100s-480272lcd-test.zip
(5)下载别人配置好的配置文件
http://dl.sipeed.com/LICHEE/Nano/SDK/config
复制下载的文件到linux源码根目录,并改名字为".config"
(6)体验可视化配置
make ARCH=arm menuconfig
(7)编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
-----------------------------------------------
出现错误:
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: 没有那个文件或目录
安装工具:
sudo apt-get install libssl-dev
-----------------------------------------------
继续编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
成功编译,生成的 zImage 在 arch ‣ arm ‣ boot 目录下
5 编译根文件系统
5.1 安装依赖
apt-get install linux-headers-$(uname -r)
5.2 使用buildroot编译根文件系统
(1)获取buildroot源码
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
(2) 配置bulidroot
make menuconfig
-----------------------------------------------
Target options --->
Target Architecture Variant (arm926t) ---> // arm926ejs架构
Enable VFP extension support // Nano 没有 VFP单元,勾选会导致某些应用无法运行
Target ABI (EABI) --->
Floating point strategy (Soft float) ---> // 软浮点
(2)下载依赖工具包
https://pan.baidu.com/s/1_tBdX9K7fOkH9JdXZ_MdiQ
下载完之后,解压后复制到"buildroot-2017.08/dl/"下,没有dl文件夹可自行创建。
也可以不下载此工具包,但是buildroot自动更具需求下载这些工具包也许很慢。
(3)编译
make
-----------------------------------------------
出现错误:
make[2]: g++: Command not found
安装G++工具:
sudo apt-get install g++
-----------------------------------------------
继续编译:
编译成功!
-----------------------------------------------
(4)查看rootfs文件的大小
ls -l output/images/rootfs.tar
6 打包出烧写spi flash的bin文件
先将已经被解压过的文件,统统存放在一个文件夹里,防止干扰视线。
mkdir Pack
mv buildroot-2017.08.tar.gz Pack
mv f1c100s-480272lcd-test.zip Pack
mv gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz Pack
mv uboot.tar Pack
如果想保持官方路线,将当前根据官方操作流程而产生的文件打包,备用
tar -cf UKB.tar buildroot-2017.08 gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi linux-f1c100s-480272lcd-test u-boot
mv UKB.tar Pack
6.1 修改uboot以适配spi flashd
(1)修改源码
在uboot源码目录下 进入 ./include/configs/,修改 suniv.h
#define CONFIG_BOOTCOMMAND "sf probe 0:50000000; " \
"sf read 0x80C00000 0x100000 0x4000; " \
"sf read 0x80008000 0x110000 0x400000; " \
"bootz 0x80008000 - 0x80C00000"
(2)更改配置
回到 uboot 源码一级目录, 进入TUI配置
make ARCH=arm menuconfig
取消勾选 [] Enable a default value for bootcmd
勾选 [v] Enable boot arguments;
在下方一项中填入 bootargs 参数:
console=ttyS0,115200 panic=5 rootwait root=/dev/mtdblock3 rw rootfstype=jffs2
(3)回到根目录重新编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
6.2 修改dts以适配spi flash
(1)修改源码
修改内核源码目录下的 ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts
将原来的&spi0{...}替换为:
&spi0 {
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins_a>;
status = "okay";
spi-max-frequency = <50000000>;
flash: w25q128@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "winbond,w25q128", "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <50000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x000000 0x100000>;
read-only;
};
partition@100000 {
label = "dtb";
reg = <0x100000 0x10000>;
read-only;
};
partition@110000 {
label = "kernel";
reg = <0x110000 0x400000>;
read-only;
};
partition@510000 {
label = "rootfs";
reg = <0x510000 0xAF0000>;
};
};
};
};
(2)重新编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j4
6.3 修改内核配置
(1)make ARCH=arm menuconfig
(2)勾选 File systems ‣ Miscellaneous filesystems ‣ Journalling Flash File System v2 (JFFS2) support
(3)修改源码下的 ./drivers/mtd/spi-nor.c
vi ./drivers/mtd/spi-nor/spi-nor.c
注释掉以下一行:
//{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
在这一行下面增加一项:
{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, 0) },
(4)重新编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
6.4 打包生成用于少些spiflash的bin文件
(1)在f1c100s目录下,新建文件夹rootfs
mkdir rootfs
(2)复制rootfs.tar到rootfs文件夹中
cp buildroot-2017.08/output/images/rootfs.tar rootfs/
(3)解压rootfs目录下的rootfs.tar
cd rootfs
sudo tar -xvf rootfs.tar
(4)删除rootfs.tar
sudo rm rootfs.tar
(5)回到f1c100s目录,编写打包命令
cd ..
vim BuildMyImage.sh
填写如下内容:
#!/bin/sh
dd if=/dev/zero of=f1c100s_spiflash_16M.bin bs=1M count=16 &&\
dd if=u-boot/u-boot-sunxi-with-spl.bin of=f1c100s_spiflash_16M.bin bs=1K conv=notrunc &&\
dd if=linux-f1c100s-480272lcd-test/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb of=f1c100s_spiflash_16M.bin bs=1K seek=1024 conv=notrunc &&\
dd if=linux-f1c100s-480272lcd-test/arch/arm/boot/zImage of=f1c100s_spiflash_16M.bin bs=1K seek=1088 conv=notrunc &&\
mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o rootfs.jffs2 &&\
dd if=rootfs.jffs2 of=f1c100s_spiflash_16M.bin bs=1k seek=5184 conv=notrunc &&\
sync
(6)运行打包脚本
sudo sh BuildMyImage.sh
-----------------------------------------------
提示错误:
BuildMyImage.sh: 6: BuildMyImage.sh: mkfs.jffs2: not found
安装mtd-utils工具:
sudo apt-get install mtd-utils
安装过程中,有可能出现超时情况,多尝试几遍或者更换源试试。
-----------------------------------------------
继续运行打包脚本:
sudo sh BuildMyImage.sh
稍等片刻,打包便能完成。
打包完成后,在当前目录,生成一个名为f1c100s_spiflash_16M.bin的文件。
7 烧写验证
(1)参考文章:https://whycan.cn/t_444.html
编译、安装Windows版本sunxi-fel步骤 (32M spi flash补丁,支持W25Q256/MX25L256)
安装好驱动,烧写bin文件到单板上。
(2)观察串口输出:
明显是存在问题,但是不知道问题出在哪里,太晚了,只能先睡觉。
回到6.26.2 修改dts以适配spi flash
(1)修改源码
在uboot源码目录下 进入 ./include/configs/,修改 suniv.h
#define CONFIG_BOOTCOMMAND "sf probe 0 50000000; " \
"sf read 0x80C00000 0x100000 0x4000; " \
"sf read 0x80008000 0x110000 0x400000; " \
"bootz 0x80008000 - 0x80C00000"
重新编译uboot。
重新打包出bin文件,并烧写。
出现以下情况,很明显,还是存在问题,贴图,:
可能是CONFIG_MTD_BLOCK没有勾上。
在linux内核根目录: make ARCH=arm menuconfig
进入配置界面后:
按/
输入CONFIG_MTD_BLOCK
进行搜索,得到以下界面。
进入→ Device Drivers,发现 已经勾选上
<*> Memory Technology Device (MTD) support --->
回车进入Memory Technology Device (MTD) support --->
看着好像有关的选项都给勾选上。贴图:
继续回车进入 Self-contained MTD device drivers
看着好像有关的选项都给勾选上。贴图:
保存退出,继续编译。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
编译完毕,打包后烧写bin文件。非常遗憾,结果依旧!
观察.config里的配置项
文件中,可以看出,MTD_BLOCK已经配置为y,但依然没能成功启动。
我怀疑也许是根文件系统配置的问题。夜深了,明日继续。
算了,还是再搞搞把,这么早休息实在没劲,继续折腾。
观察启动log,发现,卡住的地方,有一条记录: #0: Loopback 1
再次进入配置界面:make ARCH=arm menuconfig
Device Drivers --->Block devices --->
[v]Loopback device support,勾选,看到其他有的选项,也勾上吧,相信也无妨,贴图:
保存配置,继续编译。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
打包后烧录验证。
夜已深,凭借着12线程的能力,很快就编译完成,打包烧录进单板上。
上电后,观察log,非常遗憾,唉,我要睡觉了。因为linux跑起来了...贴图:
在这紧要关头,我居然忘记了登陆账号密码,无奈之下,只能去buildroot目录下看看账号密码了。
make menuconfig
System configuration --->
贴图:
原来还没有设置密码,算了,真的要休息了,明日继续。
可以看出我们没有设置密码,直接输入root即可登陆,回到根目录,可以看到熟悉的根目录文件夹,如下图:
(3) 测试程序
既然linux已经能跑起来了,我们编写一个hello.c,编译看能否执行。
cd ./rootfs
vi hello.c
#include
int main(void)
{
printf("hello whycan!\r\n");
return 0;
}
gcc编译:gcc -o hello hello.c
ubuntu中执行:./hello
输出:hello whycan!
编译到目标板:arm-linux-gnueabi-gcc -o Boardhello hello.c
因为现在没又什么方便得调试工具,直接打包进根文件系统。
sudo sh BuildMyImage.sh
烧录到spiflash中。
执行程序Boardhello。提示失败,如下图:
../buildroot-2017.08/output/host/bin/arm-linux-gcc -o Boardhello2 hello.c
依然是打包进根文件系统烧录到单板。
执行./Boardhello2程序,观察输出。
显然是成功了!