在全志的山寨平板上跑起linux

不是 chroot 也不是x86平板 没有利用安卓的任何一个部分 主线内核+主线uboot

搬运自简书 它的编辑器太难用。。。。。

现在退市的平板、机顶盒soc虽然难以胜任大部分日常使用的要求,但是完全可以胜任一些小项目,如语音助手或者智能镜子,监控的一些小demo的搭建,主要想看下现在主线对全志设备的支持怎样了嘿嘿😋。

结论:主线内核对soc的支持还是的确可以了,但是对于某些硬件的驱动还是不行,lima的3d驱动也仅仅停在可用的状态(很容易发生内存溢出,armbian正常运行需要调整内核参数给显示处理分配内存),对于某些涉及gpu的应用场景或者一些涉及摄像头的应用场景,可能sdk内核才可以,用安卓或者buildroot可能是个比较好的选择。。。。

GNU/linux对于安卓来说硬件效能的体验远远没有安卓好,主要是开源驱动和xorg的锅。

全志开源社区(linux-sunxi)比较给力,逆向工程出了vpu驱动,mali gpu驱动也提供了支持主线的二进制包,目前没试过,linux-sunxi里有说明,有需求的可以去试试。

注:这个博客只是一个尝试步骤的记录,可能不是实现的最简单办法。。。

当然有图才有真相~
Armbian

glmark2
nmtui
archlinux

这篇博文包含的主要内容:

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-crudus),用户层需要另行编译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线用不了的问题 otg模式需要在内核中勾选musb

&usb_otg {

dr_mode = "host";

status = "okay";

};

//开启drm lima gpu用得到

&be0 {

status = "okay";

};

&fe0 {

status = "okay";

};

触摸屏(按照反编译的script.bin得到配置)–固件加载有问题 Ubuntu的坑一样

设备树参数具体在linux内核的文档目录下

./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我已经上传到github了
https://github.com/HandsomeYingyan/mainline-a13-q8

使用gpu需要分配内存空间

sunxi_ve_mem_reserve=32 
sunxi_g2d_mem_reserve=32 
sunxi_fb_mem_reserve=64
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值