296 lines
14 KiB
Markdown
296 lines
14 KiB
Markdown
|
||
###Tina Linux快速入门指南 V2.0
|
||
* 适用范围:Tina Linux SDK V2.0版本
|
||
* 更新日期:2017年3月27日
|
||
***
|
||
[TOC]
|
||
|
||
####***一. 开发流程***
|
||
1. 构建linux系统编译环境(软件和硬件)
|
||
2. 下载R40 Tina Linux软件包
|
||
3. 对下载的软件包进行配置、编译和打包
|
||
4. 使用LiveSuit烧写固件,minicom进行实时观察
|
||
|
||
***具体过程***
|
||
1. 构建linux系统编译环境
|
||
(1) 硬件资源
|
||
* R40系列开发板一块
|
||
* 电源线、usb转串口线、micro-usb下载线
|
||
* pc和编译服务器
|
||
|
||
(2) 软件资源
|
||
* 编译使用Ubuntu14.04系统
|
||
* 需要安装的软件包如下:gcc, binutils, bzip2, flex, python,perl, make,ia32-libs, find, grep, diff, unzip, gawk,getopt, subversion, libz-dev and libc headers.ubuntu,可使用如下的命令直接安装相关软件包:sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip ia32-libs
|
||
* LiveSuit和minicom,LiveSuit用于把固件烧写到开发板,通过minicom进行烧写过程中观察和后续使用(LiveSuit见http://www.everything.pld1.local/C%3A/users/pld/%E6%A1%8C%E9%9D%A2/pld-know/3_%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6/7_%E8%87%AA%E5%8A%A8%E5%AE%89%E8%A3%85/auto_install_for_x64/LiveSuit )
|
||
|
||
2. 下载R40 Tina Linux软件包
|
||
* 下载repo并将其放到/usr/bin目录下(见Repo_Guide.md)
|
||
* 进入home目录,执行以下指令
|
||
* $ mkdir -p workspace/tina
|
||
* $ cd workspace/tina
|
||
* $ repo init -u http://gerrit.allwinnertech.com:8081/product/tina/manifest.git -b tina-dev -m default.xml
|
||
* $ repo sync
|
||
* $ repo start tina-dev --all
|
||
|
||
3. 对下载的软件包进行配置、编译和打包
|
||
* 进入到/home/workspace/tina目录,执行以下指令
|
||
* $ source build/envsetup.sh
|
||
* $ lunch azalea_m2ultra-tina
|
||
* $ make -j2
|
||
* $ pack -d
|
||
* 编译完成后系统镜像会自动打包在tina/out/< board >/目录下
|
||
|
||
4. 使用LiveSuit烧写固件,minicom进行实时观察
|
||
* 将开发板和PC进行正确连接
|
||
* 启动LiveSuit选择需要下载的固件
|
||
* 启动minicom进行配置(端口:ttyUSB0、波特率:115200 8N1、连接类型:serial、 Hardware Flow Control 设 为 NO)
|
||
* 按下开发板上uboot按键不要松开,再按一下reset按键,PC机上会提示:是否格式化数据分区?选择Yes或No都可以。然后其自动烧写镜像到开发板,在minicom上可以看到具体过程,等待烧写完成
|
||
|
||
####***二. Tina Linux Sdk目录结构***
|
||
|
||
Tina Linux SDK主要由构建系统、配置工具、工具链、host工具包、目标机功能包、文档、脚本、linux内核、bootloader组成。
|
||
[点击查看Tina结构图](https://www.processon.com/view/link/58d86685e4b03e064c7b8c34)
|
||
Tina/
|
||
├── build
|
||
├── config
|
||
├── Config.in
|
||
├── dl
|
||
├── docs
|
||
├── lichee
|
||
├── Makefile
|
||
├── out
|
||
├── package
|
||
├── rules.mk
|
||
├── scripts
|
||
├── target
|
||
├── tmp
|
||
├── toolchain
|
||
└── tools
|
||
|
||
- build 目录
|
||
主要由一系列.mk文件组成,它们是基于Makefile规格编写而成。主要功能有:
|
||
- 检测当前的编译环境是否满足Tina linux的构建需求
|
||
- 生成host包编译规格
|
||
- 生成工具链的编译规则
|
||
- 生成target包的编译规则
|
||
- 生成linux kernel的编译规则
|
||
- 生成系统固件的生成规格
|
||
- config 目录
|
||
config/
|
||
├── Config-build.in
|
||
├── Config-devel.in
|
||
├── Config-images.in
|
||
├── Config-kernel.in
|
||
└── top_config.in
|
||
这里存放的都是用于菜单配置项的.in文件,当执行make menuconfig时发挥作用。这里简单介绍所有调用到的.in文件,仅供参考:
|
||
[点击查看.in目录结构](https://www.processon.com/view/link/58d86b46e4b04583185077cb)
|
||
- top_config.in: 可视化配置主界面,调用其他config目录下的.in文件,初始化配置选项,用到了source命令
|
||
- Config-xxx.in: 各种可视化界面中的编译选项,含default值
|
||
- tmp/.config-package.in: 各种包支持,包含固件生成,文件系统,各种服务等
|
||
- target/Config.in: 调用tmp/.config-target.in并配置硬件特性
|
||
- toolchain/Config.in: 优化相关选项,target option,update toolchain
|
||
- tmp/.config-target.in: 开发板相关选项,系统相关选项
|
||
- target/imagebuilder/Config.in: 建立OpenWRT Image,包含package文件
|
||
- target/sdk/Config.in: 建立OpenWRT SDK
|
||
- target/toolchain/Config.in: 打包OpenWRT 基础工具链
|
||
- docs 目录
|
||
docs/
|
||
├── build.md
|
||
├── config.md
|
||
├── init-scripts.md
|
||
├── Makefile
|
||
├── network.md
|
||
├── tina.md
|
||
├── wireless.md
|
||
└── working.md
|
||
存放用于开发的文档,以markdown格式编写。后续不断完善。
|
||
- lichee 目录
|
||
lichee/
|
||
├── brandy
|
||
│ ├── add_hash
|
||
│ ├── add_hash.sh
|
||
│ ├── arm-trusted-firmware-1.0
|
||
│ ├── armv8_toolchain
|
||
│ ├── basic_loader
|
||
│ ├── build.sh
|
||
│ ├── extern-libs
|
||
│ ├── gcc-linaro
|
||
│ ├── pack_tools
|
||
│ ├── toolchain
|
||
│ ├── u-boot-2011.09
|
||
│ └── u-boot-2014.07
|
||
├── linux-3.10
|
||
└── linux-3.4
|
||
其中brandy目录用于存放bootloader,其中u-boot-2011.09用于存放R8/R16/R58的bootloader,u-boot-2014.07用于存放R18/R40的bootloader;linux-3.10是R18/R40使用的内核源码目录;linux-3.4是R8/R16/R58使用的内核源码目录。
|
||
- package 目录
|
||
package/
|
||
├── base-files
|
||
├── devel
|
||
├── firmware
|
||
├── kernel
|
||
├── libs
|
||
├── Makefile
|
||
├── network
|
||
├── system
|
||
└── utils
|
||
package 目录用于存放target机器上的软件包的源码和编译规格,目录按照目标软件包的功能进行分类。
|
||
- scripts 目录
|
||
scripts 目录用于存放pc端或者小机端使用的一些脚本
|
||
- target 目录
|
||
target/
|
||
├── allwinner
|
||
├── Config.in
|
||
├── imagebuilder
|
||
├── Makefile
|
||
├── sdk
|
||
└── toolchain
|
||
用于存放目标板相关的配置以及sdk和toolchain生成的规格
|
||
- toolchain目录
|
||
toolchain/
|
||
├── binutils
|
||
├── Config.in
|
||
├── fortify-headers
|
||
├── gcc
|
||
├── gdb
|
||
├── glibc
|
||
├── info.mk
|
||
├── insight
|
||
├── kernel-headers
|
||
├── Makefile
|
||
├── musl
|
||
└── wrapper
|
||
其中gcc目录为gcc编译器的编译规则目录,gdb为c/c++调试器编译规则目录,glibc目前没有启用,默认使用的是musl下的musl-libc
|
||
- tools 目录
|
||
tools目录下存放的是host端工具的编译规则
|
||
- Makefile 结构
|
||
最后整理一下Makefile的结构,仅供参考:
|
||
[Tina Makefile](https://www.processon.com/view/link/58d88239e4b03eea78334943)
|
||
|
||
####***三. 编译系统的内部工作原理之构建系统工作流程***
|
||
![](http://p1.bqimg.com/567571/743537a96715fa38.png)
|
||
|
||
####***四. Tina系统的 makefile简要分析***
|
||
* ***Tina - Makefile结构图***
|
||
![](https://www.processon.com/chart_image/58d8aebee4b045831853d0c0.png)
|
||
|
||
**顶层Makefile:** 里面只include了build/main.mk文件
|
||
**Build/main.mk:**
|
||
- 为Openwrt检查tina目录,此目录不能包含空格。
|
||
- Include了build/host.mk
|
||
- 检查Openwrt是否安装
|
||
- 包含rules.mk build/depends.mk target/Makefile package/Makefile tools/Makefile等Makefile文件
|
||
|
||
**Build/host.mk:**识别主机所使用工具链选项,主机的系统,主机构架,主机名字等,并在临时目录tmp下生成tmp/.host.mk 。tmp/host.mk里如下:
|
||
- HOST_OS:=Linux
|
||
- HOST_ARCH:=x86_64
|
||
- GNU_HOST_NAME:=x86_64-linux-gnu
|
||
- FIND_L=find -L $(1)
|
||
|
||
**rules.mk : ** 里面定义了主机和目标机中软件工具包的配置规则
|
||
**build/depends.mk : **里面定义了子树上的依赖关系
|
||
**build/subdir.mk : **主要包含了subdir和stampfile函数
|
||
**target/Makefile : ** 定义生成目标机软件工具包的生成规格
|
||
**package/Makefile : ** 利用源码生成软件包
|
||
**tools/Makefile : ** 定义生成主机端工具编译规则,编译时获取和编译这些工具
|
||
**toolchain/Makefile : ** 利用工具链源码生成工具链
|
||
|
||
####***五. adb简介和使用***
|
||
|
||
#####5.1 adb简介
|
||
* adb全称Android Debug Bridge,对于PC和手机.平板.开发板之间,起到调试桥的作用。借助adb工具, 我们可以对设备进行管理,还可以进行很多操作,比如运行shell命令,向开发板发送文件等。
|
||
|
||
#####5.2 adb的安装和配置
|
||
* adb的安装
|
||
* $sudo apt-get install android-tools-adb
|
||
* adb的配置
|
||
1. 将开发板和电脑正确链接,启动minicom或putty,要在minicom终端里看见开发板里系统正常启动并进入shell,如果没有烧写Tina系统到开发板,请先烧写系统
|
||
2. 打开电脑上的终端,运行命令lsusb,查看设备,找到电脑和开发板相连接的串口,如下:
|
||
![](http://i1.piimg.com/567571/360cae93370f3f4f.png)
|
||
具体看自己的电脑,也可以先拔下插在电脑上的串口USB,在电脑上使用lsusb命令查看设备;然后再插上串口,再使用lsusb命令查看设备,对比前后两次命令列出列表的不同,定位到设备
|
||
3. 使用命令 sudo vim /etc/udev/rules.d/50-android.rules 打开电脑上的50-android.rules文件(如果没有就创建一个)进行配置,这样电脑就能识别到此串口。具体配置如下(即在此文件里写入):
|
||
![](http://i4.buimg.com/567571/2902b8a93c751d3c.png)
|
||
SUBSYSTEM选项不变,ATTR{idVendor}选项中填写设备ID(设备ID见上图,根据自己设备填写),ATTR{idProduct}填写设备产品ID(设备产品ID见上图),MODE选项不变。保存退出。然后运行以下命令:
|
||
- sudo chmod a+rx /etc/udev/rules.d/50-android.rules
|
||
- sudo /etc/init.d/udev restart
|
||
4. $sudo vim ~/.android/adb_usb.ini,打开adb_usb.ini文件,向里面写入0x067b(设备ID)
|
||
5. 打开minicom,在shell里输入adbd命令,确保开发板里的adb服务正常(若出现错误,则不能使用)。然后在电脑端的运行以下命令:
|
||
- sudo adb kill-server
|
||
- sudo adb start-server
|
||
- adb devices
|
||
运行完成之后即可看见设备清单,如下:![](http://i4.buimg.com/567571/753ec38177efd46d.png)
|
||
|
||
#####5.3 adb的使用
|
||
* adb的主要命令如下:
|
||
#####**adb devices**
|
||
- 说明:查看当前连接的设备, 连接到计算机的设备或者模拟器将会列出显示
|
||
- adb start-server
|
||
- 说明:启动adb
|
||
|
||
#####adb kill-server
|
||
- 说明:关闭adb
|
||
|
||
#####adb shell
|
||
- 说明:这个命令将登录设备的shell, 后面加直接运行设备命令, 相当于执行远程命令
|
||
|
||
#####adb push
|
||
- 说明:此命令可以把电脑上的文件复制到开发板上
|
||
- 举例: adb push hello.c /tmp/ 这样就把电脑上的hello.c文件复制到了开发板上的/tmp目录下
|
||
|
||
#####adb pull
|
||
- 说明:此命令可以把开发板上的文件复制到电脑上
|
||
- 举例: adb pull /tmp/hello.c ./ 将开发板上/tmp目录下的文件hello.c复制到当前目录
|
||
|
||
#####adb version
|
||
- 说明:查看adb的版本
|
||
|
||
#####adb help
|
||
- 说明:adb的帮助,有关更多命令详情,请使用adb help命令查看
|
||
|
||
|
||
####***六. 编写程序在开发板上运行***
|
||
|
||
#####6.1 准备:
|
||
- 首先将开发软件的工具链的所在目录添加进环境变量里。对于Tina系统来说,其arm工具链在tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi/toolchain/bin目录下。然后在自己的用户目录下打开.bashrc文件,在这个文件的最后面添加一句话,如下:
|
||
export PATH=$PATH:/home/xxxxx/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi/toolchain/bin
|
||
保存后退出,然后注销系统,重新登录。登录之后在终端里输入命令env查看一下PATH变量里是否包含此目录,若包含则添加成功。
|
||
|
||
#####6.2 应用程序:
|
||
1. 编写一个简单的hello world程序
|
||
2. 用交叉工具链里的arm-openwrt-linux-gcc对其进行编译
|
||
3. 通过adb下载到开发板上,然后运行
|
||
|
||
#####6.3 驱动程序:
|
||
######6.3.1 动态加载驱动程序
|
||
1. 编写一个驱动模块,其内容如下:
|
||
![](http://i2.buimg.com/567571/7caa6a0a55430e99.png)
|
||
2. 编写相应的Makefile,其内容如下:
|
||
![](http://i1.piimg.com/567571/75aba60817c3372d.png)
|
||
3. 执行make,将会产生hello.ko文件
|
||
4. 将hello.ko文件通过adb下载到开发板上
|
||
5. 执行以下命令进行加载,查看和卸载
|
||
- $insmod hello.ko
|
||
- $lsmod
|
||
- rmmod hello
|
||
|
||
|
||
######6.3.2 静态加载驱动程序
|
||
1. 在tina/lichee/linux-3.10/drivers/char/目录下创建一个hello目录
|
||
2. cd hello,然后编写一个驱动模块,其内容和上面一样。
|
||
3. 创建一个Makefile文件,向里面写入如下内容,保存退出
|
||
![](http://i4.buimg.com/567571/9f61625e7784171e.png)
|
||
4. 创建一个Kconfig文件,向里面写入如下内容保存退出
|
||
![](http://i1.piimg.com/567571/430ffd73363e73c1.png)
|
||
5. cd ../,进入到char目录里,打开Makefile,向里面添加如下内容保存退出
|
||
![](http://i4.buimg.com/567571/3b959db9bc4dddd4.png)
|
||
6. 同样在char目录下,打开Kconfig文件,向里面添加如下内容
|
||
![](http://i2.buimg.com/567571/6d4d758d19dfa779.png)
|
||
7. 进入到tina/target/allwinner/< board >/目录下,打开modules.mk文件,向里面写入如下内容保存退出
|
||
![](http://i4.buimg.com/567571/3e063d821a10d8f2.png)
|
||
8. 在同样的目录下,打开deconfig文件,向里面写入如下内容保存退出
|
||
![](http://i2.buimg.com/567571/2e648708f61db358.png)
|
||
9. 然后回退到linux-3.10目录下,输入命令make menuconfig,选中Device Drivers--->Character devices--->hello test driver,确保其选项为M,若不是M,则按空格键选择为M,保存退出
|
||
10. 回到tina目录下,重新编译打包
|
||
11. 用LiveSuit下载打包后的镜像到开发板,通过minicom进入到开发板的终端
|
||
12. 使用命令lsmod查看是否有hello模块,若没有则执行insmod hello.ko命令安装驱动
|
||
|