不是 chroot 也不是x86平板 没有利用安卓的任何一个部分 主线内核+主线uboot
现在退市的平板、机顶盒soc虽然难以胜任大部分日常使用的要求,但是完全可以胜任一些小项目,如语音助手或者智能镜子,监控的一些小demo的搭建,主要想看下现在主线对全志设备的支持怎样了嘿嘿😋。
结论:主线内核对soc的支持还是的确可以了,但是对于某些硬件的驱动还是不行,lima的3d驱动也仅仅停在可用的状态(很容易发生内存溢出,armbian正常运行需要调整内核参数给显示处理分配内存),对于某些涉及gpu的应用场景或者一些涉及摄像头的应用场景,可能sdk内核才可以,用安卓或者buildroot可能是个比较好的选择。。。。
GNU/linux对于安卓来说硬件效能的体验远远没有安卓好,主要是开源驱动和xorg的锅。
全志开源社区(linux-sunxi)比较给力,逆向工程出了vpu驱动,mali gpu驱动也提供了支持主线的二进制包,目前没试过,linux-sunxi里有说明,有需求的可以去试试。
注:这个博客只是一个尝试步骤的记录,可能不是实现的最简单办法。。。
这篇博文包含的主要内容:
Armbian 配置
开源驱动lima 试用
dts设备树调整
内核和uboot编译
Archlinuxarm rootfs配置
参考资料
全志设备Sdcard启动
http://wiki.lemaker.org/BananaPro/Pi:Building_u-boot,_script.bin_and_linux-kernel
主线内核支持程度
http://linux-sunxi.org/Linux_mainlining_effort
反编译安卓启动参数文件script.bin
https://blog.csdn.net/renpeng009672/article/details/49908489
寨板信息
安卓下用Device Info Hw查出来的。
Cpu Allwinner A13单核armv7(基本上所有部分被主线支持)
Gpu mail 400 (lima(开源mali驱动)在主线早就有了 用户层驱动在mesa里面 但是mesa近期才将lima并入,所以archlinux是首选,apt系的新mesa要一些功夫,arm64还好 (ubuntu 带lima的mesa ppa里有 但是只有arm64)
在官方的内核树中a13缺少对gpu的定义,需要自己加。还有mali的闭源驱动可以跑在主线上,奈何认不出gpu只好作罢,在linux-sunxi里明确表明主线支持gpu的设备可以试试。
Vpu(硬解视频) 主线在内核层支持(sunxi_defconfig默认已选上),用户层需要另行编译lib
Ram 512mb
分辨率 800x480
摄像机 gc0307( 驱动来自旧的内核 主线内核尚不支持)
时钟 pcf8563(主线支持)
重力传感器 mma7660(主线支持)
触摸屏 gsl1680(主线内核有驱动但是没有firmware github上有gsl-firmware 需要自己制作firmware 但是silead_ts认不出来我的固件,诡异,好在触摸不怎么用)
Wifi rtl8188eus(主线支持 但要自己编译成模块不在内核里)armbian的内核自带,推荐使用。
如果你也想搞一个这样的寨板可以考虑下全志的soc,它对启动设备可启动性的检查nand后于sdcard,非常适合测试,sunxi-fel还可以将uboot刷入内存临时启动,调试很方便。但是全志有些soc是powervr的gpu,这个gpu很难在主线内核上跑得动。(meamo leste 项目说他们用主线内核基本跑动了一些powervr的gpu)
寨板本身用的是官方安卓内核+sdk草草改一下加个logo其他完全是aosp
Linux-sunxi里讲官方的3.0.8内核是用的script.bin给内核初始化硬件
但是主线用的是dtb只能反编译script.bin 改dts和 配置了😑
开坑
调试环境推荐ubuntu 18.04,arch系qemu-arm-static弄不来,chroot不了arm的linux,需要交叉编译的gcc和sunxi-tools还有uboot-tools,qemu 这些官方源都有就不再阐述。
跑archlinuxarm(有坑)
archlinux粗放打包的方式可能很吃空间,而且稳定运行重度依赖每天滚,如果不是要体验最新的mesa特性,建议还是使用armbian一类基于apt的发行版。
跑起主线uboot
直接下载最新版本的ubootftp://ftp.denx.de/pub/u-boot/
uboot内置了一个defconfig叫a13-q8-tablet 用这个defconfig完美引导且lcd正常(全志a13 a23 a33 都有q8设备的配置 平板可以根据这几个config修改)
配置文件在uboot的configs文件夹里
开始编译
配置环境变量
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
载入配置
make q8_a13_tablet_defconfig
make menuconfig
开整
make
之后会生成u-boot-sunxi-with-spl.bin
搞一张sd卡,用gparted建立msdos分区表!gpt uboot会覆盖它的分区表信息。。。。
用下列命令烧到sd卡里(uboot-dir表示文件位置 card表示/dev里设备的位置)
sudo dd if=${u-boot-dir}/u-boot-sunxi-with-spl.bin of=${card} bs=1024 seek=8
插到sd卡槽里重启可以看到uboot已经起来后进行下一步
配置rootfs
编译内核包(如果用我给定的内核或者armbian内核的可以跳过)
archlinuxarm的官方内核可能有坑(压根起不动)所以要单独编译适合自己硬件的内核
Archlinux的包管理与ubuntu不同所以要创建内核软件包就要chroot一个archlinuxarm。
在国内源或者archlinuxarm官网(要梯子不然很慢)搞到rootfs的压缩包
wget http://os.archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
bsdtar -xpf ArchLinuxARM-armv7-latest.tar.gz -C 《你的工作目录》
注:ubuntu 18.04的bsdtar 版本太低 2020.3的archlinuxarm的rootfs解包会报错
如果遇到如下情况恭喜中招:
bsdtar: Ignoring malformed pax extended attribute
bsdtar: Error exit delayed from previous errors.
所以要更新bsdtar
wget https://github.com/libarchive/libarchive/archive/v3.3.2.tar.gz
tar xf v3.3.2.tar.gz
cd libarchive-3.3.2
cmake .
make -j8
sudo make install
得到rootfs后拷贝翻译器来chroot
cp /usr/bin/qemu-arm-static ./usr/bin
(archlinux的aur里有qemu-arm-static但是chroot不了。。。)
之后mount系统分区到rootfs
sudo mount --bind /proc ./proc
sudo mount --bind /dev ./dev
sudo mount --bind /sys ./sys
进入rootfs
sudo chroot ./
这个时候有可能上不了网在/etc/resolv.conf 加入以下内容指定dns
nameserver 8.8.8.8
nameserver 114.114.114.114
其他的就是基本的arch操作 滚(syu)之后装东西
建议还是换下源
修改/etc/pacman.d/mirrorlist
然后把arch的那一套编译工具(makepkg git gcc)用pacman装好这里不再阐述(有点不记得包名了)
之后把ArchlinuxArm的官方PKGBUILD从git上拉下来
git clone https://github.com/archlinuxarm/PKGBUILDs.git
只要里面的./core/linux-armv7文件夹
按照自己的要求修改内核配置(目录下的config)
改配置去国内镜像站搞一套linux源代码来就可以了(版本要与pkgbuild里的一致)
内核的配置文件中提供了sunxi_defconfig 只提供了让CPU跑起来的最小配置
u盘,无线网默认都没有选上这是一个比较大的坑,还有lima要跑起来lima和sun4i-drm都必须要选上(最好是模块形式(M)便于调试)
配置好后复制.config到linux-armv7目录下替换config文件并生成MD5码
md5sum ./config
替换PKGBUILD文件里的md5码顺便替换下源这里用的清华源
source=("https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/${_srcname}.tar.xz"
"https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/patch-${pkgver}.xz"
搞好后makepkg即可
调试设备树
在linux-armv7的文件夹下编译后会产生源码文件夹,进入内核文件夹按前文的方法设置好交叉编译环境变量
在./arch/boot/arm/dts文件夹下找到sun5i-a13-q8-tablet.dts
具体设备树前面的&表示对soc级别的(dtsi)设备树的附加和修改
加入以下内容改变usb模式为主模式解决otg线用不了的问题
&usb_otg {
dr_mode = "host";
status = "okay";
};
开启VPU 用来硬解1080p视频
&be0 {
status = "okay";
};
&fe0 {
status = "okay";
};
触摸屏(按照反编译的script.bin得到配置)--固件加载有问题 Ubuntu的坑一样
设备树参数具体在linux内核的文档目录下(当然你的English要好)
/Documentation/devicetree/bindings/input/touchscreen/
例如我的silead gsl1680
6 11 对应sunxi格式的PG11 (格式 P+字母+数字 A表示0)
&touchscreen {
reg = <0x40>;
compatible = "silead,gsl1680";
firmware-name = "gsl1680-q8.fw";
interrupt-parent = <&pio>;
interrupts = <6 11 IRQ_TYPE_EDGE_FALLING>; //PG11
power-gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; //PB03
touchscreen-size-x = <800>;
touchscreen-size-y = <480>;
touchscreen-inverted-x;
status = "okay";
};
声卡
&codec {
status = "okay";
};
主线的linux支持A13的gpu但是没有在dtsi里声明导致模块不加载
在sun5i-a13.dtsi里的soc结构里加入mali的描述
(照着a10和pocketchip内核相应参数改的)
mali: gpu@1c40000 {
compatible = "arm,mali-400", "arm,mali-utgard";
reg = <0x01c40000 0x10000>;
interrupts = <69>,
<70>,
<71>,
<72>,
<73>;
interrupt-names = "gp",
"gpmmu",
"pp0",
"ppmmu0",
"pmu";
clocks = <&ccu CLK_AHB_GPU>, <&ccu CLK_GPU>;
clock-names = "bus", "core";
resets = <&ccu RST_GPU>;
assigned-clocks = <&ccu CLK_GPU>;
assigned-clock-rates = <312000000>;
};
在保存后在内核源代码根目录输入(不要忘了设置环境变量)
make dtbs
即可得到设备树
之后在准备好SD卡部署另一个rootfs,用写入过uboot的sd卡新建一个ext4的分区(前面空出10mb左右的空间保护uboot)
再用相同办法解压archlinuxarm的rootfs到sd卡
复制好qemu-arm-static和前面步骤编译好的内核软件包后chroot进rootfs
直接 pacman -U 内核文件名(嫌麻烦的同学可以使用armbian生成内核 然后用aur里的debtap脚本转换成archlinuxarm软件包)
得到一个可以基本启动的archlinux
不要忘了替换在/boot/dtb开头的文件夹里的dtb
在boot文件夹下加入boot.scr
archlinuxarm提供了boot.scr但是没有放在支持列表里
https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/sunxi/boot/a13-olinuxino/
差不多就可以启动了🤓
但是Archlinux 逼近主线 忠于上游无修改的包哲学对于我等小白配置好所有东西还是太吃力 搞了几天后搞不动声卡果断弃坑(armbian的alsa跑的通估计魔改过)
弃坑主要的一点是无法判断是设备树的问题还是rootfs的问题😡
Armbian (相对坑少,但是包旧)
还好各种派的轮子层出不穷,一群大神搞出了自动化deb系rootfs构建脚本,内核配置uboot编译一条龙服务,最终得到的img可以直接像树莓派镜像一样烧写(etcher),(但预定内核配置有坑 uboot卡在Starting Kernel,还有dts的修改要参照上文 mesa版本太低也是一个坑) 推荐在配置时使用官方支持的ubuntu 18.04 其他的版本电源管理有问题upower识别不了电池。
加入设备描述文件和内核配置
把前面配置archlinuxarm的内核配置文件直接拖到./config/kernel/linux-sunxi-current.config 在内核编译的选单里直接选择current来启用这个配置。
设备文件在./config/boards里
.conf表示被官方支持的设备,直接出现在选单里。
.csc 表示社区支持的设备
.eof 表示结束支持的设备
.wip表示还没适配完的设备
照着一个配置文件改了一个
内容如下
# A13 single core 512Mb
BOARD_NAME="A13-Handsomepad"
BOARDFAMILY="sun5i"
BOOTCONFIG="q8_a13_tablet_defconfig" #这里是uboot的配置文件,armbian是直接拉取uboot官方源码所以要严格按照defconfig提供的文件名来
KERNEL_TARGET="current,dev" #显示的内核版本编译选项
然后用root权限执行无脑编译脚本
sudo ./combile.sh
可能需要梯子来加快下载。。。
选择对应的设备 镜像文件就会出现在armbian目录下的output文件夹里。
烧到sd卡后用同样的办法替换/boot/dtb里的设备树,插到平板上就可以跑动一个基本的Ubuntu 18.04了!
lima驱动的试用
我的xorg.conf.d
Section "ServerFlags"
Option "AutoAddGPU" "off"
Option "Debug" "dmabuf_capable"
EndSection
Section "OutputClass"
Identifier "Lima"
MatchDriver "sun4i-drm"
Driver "modesetting"
Option "PrimaryGPU" "true"
EndSection
我的mesa https://github.com/HandsomeYingyan/mainline-a13-q8
我的内核参数 sunxi_ve_mem_reserve=32 sunxi_g2d_mem_reserve=32 sunxi_fb_mem_reserve=64
××××××××××××××××××××××××××××××××××××××××××施工线
未完待续