我用一杯咖啡因,体验了一次命定的失败旅程,但期间遇见的塔尖,忆记长新。

继上篇  《手机上通过 iSh 使用的 Alpine Linux 环境的契机和方法 》的探索;发现,ish 似乎包含了一个完整的 linux 系统。这不禁让我好奇,那:它真的和 PC 上运行的 linux 系统完全一致吗?是不是在 PC 上能做的事情,也能在 ish 中完成呢?当然,这里说的肯定不包含需要大量算力的事情了。

于是,纯粹为了好玩,就想,我能不能用它来让 imx6ull 成功运行,点亮主板的 led ?

从已知到未知的探索中,“类比验证“总是一项可靠的方法。吗?

 

计划

我们尝试仅用 IOS 完成 led 代码的编写、编译、烧录、上机点亮 led。如果整个过程都能够顺利进行,则可以说明嵌入式的开发管线都是通的。这在实际工作中可能没什么意义,但对学习探索而言,却着实有趣。

 

让过程舒服些

让 ish 能够读取手机上的文件夹

首先,抛弃在 ish 中使用 vim / vi 来编写、修改代码的念头,不用那些 old school的东西;我们用其他现代化的编辑器。但由于 IOS 沙盒机制的限制,App 之间是不能互相读取对方文件夹下的文件的,但都可以读取  “文件”这个“第三方” app 中的文件夹和文件。因此,我们可以设置一个中转文件夹来 “绕过” 这个机制。

这就像由于美国对我们征收高关税,我们就不直接出口到美国,而是先将货物转运到越南 / 墨西哥等等国家,贴上当地公司的牌子,中转一下,借此绕过美国的高关税。

有了这个 “第三方文件夹” 后,我们需要将其挂在到 ish 中,让 ish 能够读到它里面的内容。

这里,我们可以如此实现:

  • 在 ish 中 cd 到 /mnt 路径下
    1
    cd /mnt
  • mnt 中新建一个文件夹
    1
    mkdir documents
  • 然后输入以下命令并运行:
    1
    mount  -t  ios . documents

    ,  此时,系统会弹出 选择器,选择你想要可以在 ish “看到/访问”到的文件夹,即可将文件夹挂在到 ish 的linux系统里面,方便后继的文件共享;

  • 这里是操作示例视频;从视频也可以发现:除了手机内的文件夹,我们甚至也可以将U盘挂在到linux中

例如经上述操作 我们将手机中的 LINUX_FILES 通过挂载在到 ish 中的 /mnt/documents 下,我们就可以将编辑器编写的文件存到 LINUX_FILES 中,然后再到 ish 中 将代码进行编译。

folder_mounted
folder_mounted

 

配置imx6ull开发工具链

cmake在上文中已经完成安装,那么我们还剩下 Arm工具链 以及 烧录工具链。而我们知道,ishlinux 系统是 Alpine Linux。那么我们可以尝试搜索 alpine linux arm gcc toolchain,非常幸运地,我们发现 Alpine Linux 似乎有支持的安装包。

alpine linux arm gcc toolchain
alpine linux arm gcc toolchain

安装交叉编译器 Arm dev toolchain

于是,我们到 ish 中搜索一下

1
apk search gcc-arm

发现确实有对应的 package ,于是,我们可以通过输入下列命令进行安装;

1
apk add gcc-arm-none-eabi-stage1

查看 toolchain 安装内容

等待命令运行完成,我们查看下安装哪些工具:

1
ls /usr/bin
toolchain_installed
toolchain_installed

我们发现编译工具、链接工具等等都成功安装。那么我们进行下一步。

 

安装 imxdownload 烧录工具

将主板供应商提供的烧录工具下载到上文提到的 “中转站” LINUX_FILES 下的 burn_program 文件夹中,

并进行编译:

1
gcc imxdownload.с -o imxdownload -L ./

测试运行:

1
./imxdownload

为方便后续操作,我们将编译好的程序链接到 /usr/bin 中,这样就可以只输入 imxdownload 运行程序;

编译烧录工具
编译烧录工具

看起来,目!前!为!止! 一!切!正!常!非常顺利!是的,事情进展的顺利程度出乎我的意料,而此时的我还不知道潜伏在喜悦背后的,是怎样“凶险”的恶魔与无奈。

 

编写 LED 灯代码和 makefile

在上面的准备工作都完成后,我觉得只需要验证编译和烧录步骤可以证明手机也是可以“极具生产力”,而且不只是视频博主们喜爱的“剪辑渲染视频”式的生产力。于是,我将之前写好的 LED 点灯程序makefile 保存到 /mnt/documents 中,然后进行编译,这里需要注意的是,需要对 makefile 进行修改, 根据 /usr/bin 中已安装的 arm toolchain 名称修改命令:

Makefile
Makefile

这里,burn 的部分不是必须的,但我添加到此处是为了后续操作的连续性和一致性,避免在同的文件夹中来回切换。同时,上文中,我们进行文件夹挂载的时候,视频是以 U盘路径为例子的,这里,我们将其写在 makefile 中的 burn 部分, 意思是通过 imxdownload 程序,将 编译好的 led.bin 程序 烧录 到 U盘(/mnt/USB-A)。

编译

1
make

运行成功

makefile编译
makefile编译

此时,我们将U盘连接上手机后运行命令进行烧录:

1
make burn

运行失败:

make烧录
make烧录

这里的原因是 imxdownload.c 中构建烧录命令中用到的 dd 命令在 alpine linux 中 iflag / oflag 并没有支持 dsync 参数

1
2
3
4
/* 143行 构建烧写的shell命令 */
cmdbuf = malloc(SHELLCMD_LEN);
sprintf(cmdbuf, "sudo dd iflag=dsync oflag=dsync if=load.imx of=%s bs=512 seek=2",argv[2]);
printf("Download load.imx to %s  ......\r\n", argv[2]);

一次注定不成功的尝试

后来,通过修改 dsync 参数为 aplpine linux 支持的 direct 后的 imxdownload.c 将重新编译后,成功将程序烧录到U盘中。但是,这样烧录的文件,真的能让 led 点亮吗?约摸是不行的。

因为,在处理 dsync 参数错误的过程中,根据 deepseek/chatgpt 的回答以及查阅的资料表明:

  1. 挂载路径(如/mnt/USB-A)通常指文件系统,而烧录需直接操作块设备(如/dev/sdd);
  2. dsync 的作用是强制每次读写操作直接写入物理设备,绕过系统缓存,确保数据立即持久化。改成 direct 后,数据可能暂存于缓存,未立即写入设备,可能导致数据丢失或烧录不完整(ref);

后来,我进入 ish 的官方 discord 群;确定了ish 无法直接将U盘自动挂载到 /dev ,也没有相关的开发计划。这似乎也意味着,我们的探索之旅就只能就此止步了。

 

尽管如此,我们还是顺利地走完了这次旅途的绝大部分路程。

至此。

 

附录

烧录工具源码: Download

LED灯源码: Download

修改后的Makefile: Download