LITREILY
https://www.gravatar.com/avatar/6ae20d989e9d976faf00ecc6d9bcfe82
Stay Hungry, Stay Foolish
2024-02-05T08:40:35.944Z
https://www.litreily.top/
litreily
707922098@qq.com
Hexo
RK3288 Android6 新增分区
https://www.litreily.top/2024/02/05/rk32-new-part/
2024-02-05T08:38:12.000Z
2024-02-05T08:40:35.944Z
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>特定情况下需要新增分区,比如开辟一个分区专门用于保存系统日志,恢复出厂默认时不会被清理. 以新增slog分区为例,说明RK3288 Android6新增分区的方法。</p>
<h2 id="代码结构"><a href="#代码结构" class="headerlink" title="代码结构"></a>代码结构</h2><pre><code class="bash"># package-file
FFTools/mkupdate/package-file
# 分区表
FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt
# 开机自动挂载相关
device/rockchip/rk3288/
|-- fstab.rk30board.bootmode.emmc
|-- init.rc
`-- slog
`-- README.md
# 创建 slog.img
mkimage.sh
</code></pre>
<h2 id="新增分区"><a href="#新增分区" class="headerlink" title="新增分区"></a>新增分区</h2><h3 id="修改
RK3288 Android6 禁用 wifi
https://www.litreily.top/2024/01/10/rk32-disable-wifi/
2024-01-10T08:55:19.000Z
2024-02-05T09:15:43.094Z
<p>某些特殊情况下,需要禁用系统的wifi配置功能。</p>
<h2 id="删除快捷-wifi-开关"><a href="#删除快捷-wifi-开关" class="headerlink" title="删除快捷 wifi 开关"></a>删除快捷 wifi 开关</h2><p>在 <code>frameworks/base</code> 中的 <code>SystemUI</code> app 中禁用wifi开关,只需要修改配置 <code>quick_settings_tiles_default</code> 即可。</p>
<pre><code class="patch">--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -119,7 +119,7 @@
<!-- The default tiles to display in QuickSettings -->
<string name="quick_settings_tiles_default" translatable="false">
- wifi,bt,inversion,dnd
RK3399 Android10 bind cpu with isolcpus
https://www.litreily.top/2023/12/06/isolcpus/
2023-12-06T07:29:46.000Z
2023-12-06T08:48:22.093Z
<p>Per new request to bind cpus for some special processes, we need isolate some cpus of RK3399, which only used for thes special processes.</p>
<p>we can update dts file to set <code>isolcpus</code> arg in <code>bootargs</code>.</p>
<h2 id="set-isolcpus"><a href="#set-isolcpus" class="headerlink" title="set isolcpus"></a>set isolcpus</h2><pre><code class="bash">diff --git a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
index 76753a9..a2a3206 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk
RK3288 Android 10 系统开发[6] - 新增lunch
https://www.litreily.top/2023/04/17/android-lunch/
2023-04-17T12:47:59.000Z
2023-04-17T13:02:06.605Z
<p>如果要新增产品,在Android sdk中可以新增lunch进行适配。以 rk3288 产品为例,新增 rk3288_tablet.</p>
<ol>
<li>首先从已有的 <code>rk3288_Android10</code> 拷贝一份到新增的 <code>rk3288_tablet</code> 目录;</li>
</ol>
<pre><code class="bash">cd <SDK>/device/rockchip/rk3288
cp -rf rk3288_Android10 rk3288_tablet
</code></pre>
<ol start="2">
<li>然后修改 <code>device/rockchip/rk3288/AndroidProducts.mk</code> 文件,添加新产品配置</li>
</ol>
<pre><code class="patch">--- a/AndroidProducts.mk
+++ b/AndroidProducts.mk
@@ -16,8 +16,11 @@
PRODUCT_MAK
RK3288 Android 系统 boot.img 镜像解压方法
https://www.litreily.top/2023/01/19/binwalk/
2023-01-19T02:38:26.000Z
2023-01-19T07:21:22.151Z
<h2 id="android-6-0-boot-img-解包"><a href="#android-6-0-boot-img-解包" class="headerlink" title="android 6.0 boot.img 解包"></a>android 6.0 boot.img 解包</h2><h3 id="file"><a href="#file" class="headerlink" title="file"></a>file</h3><p>file指令可以显示文件类型,但是对于特定封装的文件无能为力,比如Android系统编译出的<code>boot.img</code></p>
<pre><code class="bash">$ file boot.img
boot.img: data
</code></pre>
RK3288 Android 10 系统开发[5] - 解决wifi mac随机问题
https://www.litreily.top/2022/12/07/rand-mac/
2022-12-07T07:45:04.000Z
2022-12-07T08:23:42.354Z
<p>在Android10的使用过程中,由于业务要求使用wifi mac地址作为设备的 <code>SN</code> ,所以要求mac地址必须是唯一且固定的。然而测试发现在wifi 连接过程中会出现短暂时间的随机mac,wifi连接成功后保持稳定。</p>
<h2 id="Android-官方解释"><a href="#Android-官方解释" class="headerlink" title="Android 官方解释"></a>Android 官方解释</h2><p><img src="/assets/android/rand-mac.png" alt="rand mac"></p>
<p>从官方解析来看,高版本安卓系统为了安全考虑,支持随机分配wifi mac.</p>
<p>但是要支持的话需要修改以下参数:</p>
<pre><code class="bash">frameworks/base/core/res/res/values/config.xml
- config_wifi_connected_mac_randomization_supported
- config_wifi_p2p_mac_randomization_supported
</code></pre>
<p>但是这两个参数默认已经配置为 <code>false</code> 了。只能换个方向查。<
RK3288 Android 6.0 logcat 过滤带冒号的 tag
https://www.litreily.top/2022/11/06/logcat-arg/
2022-11-06T10:32:20.000Z
2022-12-07T08:23:57.410Z
<h2 id="logcat-过滤"><a href="#logcat-过滤" class="headerlink" title="logcat 过滤"></a>logcat 过滤</h2><p>logcat 过滤不打印的日志时,可以使用 <code><tag>:S</code> 的参数,比如排除 ActivityManager 相关日志。使用 以下指令</p>
<pre><code class="bash">logcat ActivityManager:S
</code></pre>
<p>但是我遇到一种特殊情况,应用app的tag中包含了冒号,比如 <code>APP:SDK--</code>, 其它类似的tag有很多,这种情况使用以下指令是无法过滤掉的。</p>
<pre><code class="bash">logcat APP:SDK--:S
</code></pre>
<p>为了分析原因,需要查看 <code>logcat</code> 源码。</p>
<pre><code class="bash">system/core/logcat/logcat.cpp
system/core/liblog/logprint.c
</code></pre>
<h3 id="logcat-cpp"><a href="#logcat-cpp" class="headerli
RK3288 Android 10 系统开发[4] - 提供 app 默认权限
https://www.litreily.top/2022/07/12/android-perm/
2022-07-12T09:49:46.000Z
2022-07-12T10:20:53.050Z
<h2 id="禁用旧版本SDK弹框"><a href="#禁用旧版本SDK弹框" class="headerlink" title="禁用旧版本SDK弹框"></a>禁用旧版本SDK弹框</h2><p>如果在Android10系统上安装旧版本的app,会提示以下信息。</p>
<blockquote>
<p>此应用专为旧版 Android 打造,因此可能无法正常运行。请尝试检查更新或与开发者联系。</p>
</blockquote>
RK3288 Android 6.0 适配 RTL8821CU wifi&BT 功能
https://www.litreily.top/2022/07/08/rk3288-bt/
2022-07-08T09:54:55.000Z
2022-07-08T11:02:08.349Z
<h2 id="需求背景"><a href="#需求背景" class="headerlink" title="需求背景"></a>需求背景</h2><p>项目需求,要求添加蓝牙功能,选择的芯片是WIFI&蓝牙二合一的 <code>RTL8821CU</code>.</p>
<p>为此,需要更新蓝牙和wifi的相关驱动,以及Android系统层的一些配置,同时还要向下兼容旧的wifi芯片 RTL8188EU.</p>
<h2 id="相关文件"><a href="#相关文件" class="headerlink" title="相关文件"></a>相关文件</h2><pre><code class="bash"># kernel
## config
kernel/arch/arm/configs/rockchip_defconfig
## dts
kernel/arch/arm/boot/dts/rk3288-tb_8846.dts
## wifi
kernel/drivers/net/wireless/rockchip_wlan/rtl8821cu/*
kernel/drivers/net/wireless/rockchip_wlan/rtl8821cu/Makefile
kernel/drivers/net/wireless/rockchip_wlan/wifi_sys
RK3288 Android 10 系统开发[3] - 结合 gitlab 搭建 repo 代码仓库管理平台
https://www.litreily.top/2022/02/24/gitlab-repo/
2022-02-24T08:26:13.000Z
2022-02-24T08:31:43.202Z
<p>目前为了本地服务器搭建 <code>gitlab</code> 管理平台,并配合 <code>gerrit</code> 进行代码审查,需要对代码管理重新部署。</p>
<p>Android 系统使用 <code>repo</code> 管理源码,但是 <code>Android 10</code> 源码包含 <code>732</code> 个仓库,如果在本地 gitlab 服务器和 <code>gerrit</code> 服务器上将所有的仓库都创建一遍的话,仓库太多了, 不便于管理和审查,所以需要重新设计代码结构,并使用 <code>repo</code> 和 <code>manifest</code> 进行管理,为此,我先使用官方 <code>gitlab</code> 搭建了一些测试仓库。用于学习和研究 <code>repo</code> 的代码管理方式。</p>
<h2 id="gitlab-操作"><a href="#gitlab-操作" class="headerlink" title="gitlab 操作"></a>gitlab 操作</h2><h3 id="新建-group"><a href="#新建-group" class="headerlink" title="新建 group"></a>新建 group</h3><p>首先在 <code>gitlab
RK3288 Android 10 系统开发[2] - 更新开机logo与动画
https://www.litreily.top/2022/02/22/android-ani/
2022-02-22T01:58:40.000Z
2022-02-22T02:03:47.937Z
<h2 id="替换开机logo"><a href="#替换开机logo" class="headerlink" title="替换开机logo"></a>替换开机logo</h2><p>在 <code>kernel</code> 目录,将 <code>logo.bmp</code>, 以及 <code>logo_kernel.bmp</code> 替换为所需logo即可。</p>
<ul>
<li>logo.bmp: uboot 阶段显示</li>
<li>logo_kernel.bmp: kernel 阶段显示</li>
</ul>
<h2 id="替换-Android-开机动画"><a href="#替换-Android-开机动画" class="headerlink" title="替换 Android 开机动画"></a>替换 Android 开机动画</h2><h3 id="替换-bootanimation-zip"><a href="#替换-bootanimation-zip" class="headerlink" title="替换 bootanimation.zip"></a>替换 bootanimation.zip</h3><p><code>rk3288</code> android10 的动画文件位于 <code>device/rockchip/common<
RK3288 Android 10 系统开发[1] - 支持 EC20 4G 模块
https://www.litreily.top/2022/02/21/android-4g/
2022-02-21T08:50:51.000Z
2022-02-21T09:48:42.921Z
<p>根据业务需求,需要升级安卓系统,从 <code>Android6.0</code> 升级到 <code>Android10.0</code>, 本节介绍如何移植 <code>EC20 4G</code> 模块。</p>
<p>主要参考 <code>Quetecl</code> 提供的以下文档。</p>
<ul>
<li><code>Quectel_WCDMA&LTE_Linux_USB_Driver_User_Guide_V1.8.pdf</code></li>
<li><code>Quectel_Android_RIL_Driver_User_Guide_V1.9.pdf</code></li>
</ul>
<h2 id="kernel"><a href="#kernel" class="headerlink" title="kernel"></a>kernel</h2><p>内核部分,需要修改两部分,<code>EC20</code>模块的使能和供电, 以及 <code>EC20</code> 联网所需的驱动移植。</p>
<h3 id="EC20-供电使能"><a href="#EC20-供电使能" class="headerlink" title="EC20 供电使能"></a>EC20 供电使能</h3><p>针对供电使能问题,<code>dts</code
RK3288 android 6.0 卡死在开机logo画面问题处理
https://www.litreily.top/2022/01/11/rk3288-hang/
2022-01-11T03:49:02.000Z
2022-02-21T08:52:04.167Z
<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><p>烧录固件后,会概率性出现卡死在开机画面无法启动的问题,但是烧录新固件后会恢复正常。对比不同机型,发现只有带<strong>摄像头功能</strong>的机型会有这个问题。</p>
<h2 id="Root-cause"><a href="#Root-cause" class="headerlink" title="Root cause"></a>Root cause</h2><p>经过大量测试和排查,发现卡死问题源自一个文件, <code>/data/camera/media_profiles.xml</code> , 这是一个空文件,删除后系统就正常启动了。</p>
<p>通过使用 <code>logcat</code> 结合系统源码发现,该文件是摄像头配置文件,如果为空会导致系统循环检测该文件,并尝试从中获取摄像头配置,但是由于文件为空,导致一直获取失败,最后陷入死循环。</p>
<pre><code class="bash">$ cd /data/camera
$ ls
media_profiles.xml
</code></pre>
<p>经过排查源码,发现系统在
RK3288 android 6.0 user release 相关问题处理
https://www.litreily.top/2021/12/31/rk3288-security/
2021-12-31T02:58:22.000Z
2022-02-21T08:52:09.747Z
<p>之前一直用的 <code>userdebug</code> 版本,默认 <code>adb root</code> 或者使用 <code>su</code> 即可获取 root 权限。目前基于安全考虑,固件发布需要使用 <code>user</code> 版本配置,很多功能都需要重新测试,下面对 <code>RK3288</code> <code>user</code> 发布版本遇到的问题进行总结。</p>
<h2 id="编译固件"><a href="#编译固件" class="headerlink" title="编译固件"></a>编译固件</h2><p>首先是编译固件,将原先的 <code>rk3288-userdebug</code> 改为 <code>rk3288-user</code>.</p>
<pre><code class="bash">./FFTools/make.sh -d rk3288-tb_8846 -j16 -l rk3288-user
./FFTools/mkupdate/mkupdate.sh -l rk3288-user
</code></pre>
<p>下面是 firefly 官方 wiki 文档对 <code>user</code>, <code>userdebug</code>, <code>eng</code> 版本的对比。</p>
RK3288 android 6.0 user release 获取 root 权限
https://www.litreily.top/2021/12/30/rk3288-su/
2021-12-30T02:22:18.000Z
2022-02-21T08:52:12.711Z
<p>编译 RK3288 <code>user</code> 版本后,固件不会安装su,也就无法使用root权限,导致很多功能无法调试,非常不便。</p>
<p>为此,我想办法把 su 重新加到系统里了。</p>
<h2 id="准备su"><a href="#准备su" class="headerlink" title="准备su"></a>准备su</h2><p>先使用 <code>userdebug</code> 模式编译系统,将 <code>out/target/product/rk3288/system/xbin/su</code> 保存到别的地方,因为改用 <code>user</code> 模式编译后会覆盖掉。</p>
<pre><code class="bash">mkdir ~/backup
cp out/target/product/rk3288/system/xbin/su ~/backup/
</code></pre>
<h2 id="删除-su-Android-mk"><a href="#删除-su-Android-mk" class="headerlink" title="删除 su Android.mk"></a>删除 su Android.mk</h2><pre><code class="bash">rm system/extras/su/Andro
RK3399 新设计工控机配置指南
https://www.litreily.top/2021/12/20/rk3399-dts/
2021-12-20T06:20:20.000Z
2021-12-21T06:13:50.773Z
<p>用时两周,总算将新的 RK3399 工控机配置好了,期间遇到各种坑,在此记录一二。</p>
<h2 id="RK3399-工控机硬件配置"><a href="#RK3399-工控机硬件配置" class="headerlink" title="RK3399 工控机硬件配置"></a>RK3399 工控机硬件配置</h2><p>首先看下硬件配置。</p>
<table>
<thead>
<tr>
<th>接口</th>
<th>数量</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>TypeC</td>
<td>1个</td>
<td>OTG 口,可用于烧录固件</td>
</tr>
<tr>
<td>USB3.0</td>
<td>4个</td>
<td></td>
</tr>
<tr>
<td>USB2.0</td>
<td>2个</td>
<td></td>
</tr>
<tr>
<td>RTC芯片 hym8563</td>
<td>1个</td>
<td>用于RTC时钟存储</td>
</tr>
<tr>
<td>SD</td>
<td>1个</td>
<td>可插入SD/TF 卡</td>
</tr>
<tr>
<td>HDMI</td>
<td>1个</td>
<td>可接显示器</td>
</tr>
<tr>
<td>
RK3288 android 6.0 内置系统应用
https://www.litreily.top/2021/10/27/system-app/
2021-10-27T11:02:51.000Z
2022-02-21T08:52:22.259Z
<p>安卓系统的内置应用可分为以下两大类:</p>
<ol>
<li>可卸载的普通应用</li>
<li>不可卸载的系统应用,可以在首次烧录后自启动</li>
</ol>
<h2 id="可卸载应用"><a href="#可卸载应用" class="headerlink" title="可卸载应用"></a>可卸载应用</h2><p>对于可卸载应用,其内置很简单,只需要将apk文件放置在指定目录即可。</p>
<pre><code class="bash">cp My_application.apk device/rockchip/rk3288/preinstall_del/
</code></pre>
<h2 id="不可卸载应用"><a href="#不可卸载应用" class="headerlink" title="不可卸载应用"></a>不可卸载应用</h2><p>针对不可卸载的系统应用,复杂一些,需要放置在 <code>packages/apps</code> 目录,具体操作如下:</p>
<pre><code class="bash">apk_file=My_application.apk
install_dir=packages/apps/${apk_file}
mkdir ${install_dir}
cp ${ap
解压并更新 ramdisk.img 或 initrd.img
https://www.litreily.top/2021/07/31/ramdisk/
2021-07-31T06:03:20.000Z
2021-07-31T06:18:36.245Z
<p><code>ramdisk.img</code> 或者 <code>initrd.img</code> 是类似的,都是一个小型的文件系统。在系统启动过程中起到引导的作用,内核通过它来启动真正的根文件系统。</p>
<p>有时候需要修改并更新这个文件,下面以<code>ramdisk.img</code> 为例进行说明。</p>
<h2 id="解压-ramdisk-img"><a href="#解压-ramdisk-img" class="headerlink" title="解压 ramdisk.img"></a>解压 ramdisk.img</h2><p><code>ramdisk.img</code> 其实是一个<code>gz</code>格式的压缩包,可以通过 <code>gzip -d</code> 或者 <code>gunzip</code> 解压,不过需要注意的是 <code>gzip</code>, <code>gunzip</code> 会检查文件名后缀,所以需要先将后缀更新为 <code>.gz</code>. 下面将其解压至新建的 <code>root</code> 目录。</p>
<pre><code class="bash">$ cp ramdisk.img ramdisk.gz
$ gzip -d ramdisk.gz
$ mkdir root
RK3288 android 6.0 移植 gt9xx 驱动
https://www.litreily.top/2021/07/16/gt9xx-drvier/
2021-07-16T05:49:36.000Z
2022-02-21T08:52:30.995Z
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><ul>
<li>平台:RK3288</li>
<li>系统:Android 6.0</li>
<li>需求:触摸屏驱动移植</li>
</ul>
<h2 id="驱动移植"><a href="#驱动移植" class="headerlink" title="驱动移植"></a>驱动移植</h2><p>先从厂商获取驱动程序 gt9xx_v2.8.0.2.</p>
<pre><code class="bash">gt9xx_v2.8.0.2
├── dtsi
│ ├── gt9xx_dts.txt
│ ├── pinctrl_mtk.txt
│ └── pinctrl_qcom.txt
├── goodix_tool.c
├── gt9xx.c
├── gt9xx.h
├── gt9xx_update.c
├── Kconfig
└── Makefile
</code></pre>
<p>新建目录 <code>drivers/input/touchscreen/gt9xx_v2.8.0.2/</code> ,将以上 <code>.c</code>, <code>.h</code>, 及 <code>Makefile</cod
RK3288 android 6.0 同时打开两个摄像头
https://www.litreily.top/2021/07/12/dual-camera/
2021-07-12T10:02:15.000Z
2022-02-21T08:52:33.715Z
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><ul>
<li>平台: RK3288</li>
<li>系统: Android 6.0</li>
<li>需求: 同时打开两个摄像头</li>
</ul>
<p>业务需求,要支持同时打开多个摄像头,期间遇到一些问题,在这里记录下。</p>
<h2 id="问题分析"><a href="#问题分析" class="headerlink" title="问题分析"></a>问题分析</h2><h3 id="支持多摄像头"><a href="#支持多摄像头" class="headerlink" title="支持多摄像头"></a>支持多摄像头</h3><p>首先,Android系统默认只支持同时打开一个摄像头,并且最大只识别两个摄像头。所以,为了支持多摄像头,需要修改摄像头相关的 <code>HAL</code> 层。</p>
<p>这个我参考 <a href="https://www.programmersought.com/article/12481783276/">[AndroidO] [RK3399] Support 4 way camera preview</a> 解决了。patch 如下:</p>
<pre><code c
RK3288 android 6.0 实现 lvds + edp 双屏异显
https://www.litreily.top/2021/06/18/dual-lcd/
2021-06-18T08:23:15.000Z
2022-02-21T08:52:36.131Z
<p><code>rk3288</code> 默认支持 edp+hdmi 双屏显示,或者 lvds + hdmi, 但不支持 <code>lvds</code> + <code>edp</code> 双屏异显。业务要求,需要使用RK3288 Android 6.0 系统,支持 <code>lvds</code>, <code>edp</code> 两种接口的双屏异显。本文介绍具体的实现方法。</p>
<ul>
<li>平台: RK3288</li>
<li>系统: Android 6.0</li>
<li>屏幕: LVDS(7 inch 1024x600), edp(11 inch 1920x1080)</li>
<li>需求: LVDS (Primary) + edp (EXTEND) 双屏异显</li>
</ul>
<blockquote>
<p> 主屏副屏的切换只要修改dts相关参数即可,<code>lvds</code> <code>edp</code> 主副互换比较简单。</p>
</blockquote>
<h2 id="kernel"><a href="#kernel" class="headerlink" title="kernel"></a>kernel</h2><p>首先修改 <code>kernel</code>, 这里参考了博客<a href="https:
解决Ubuntu 18.04 minicom 不支持 1500000 波特率的问题
https://www.litreily.top/2021/05/28/cp210x/
2021-05-28T03:26:15.000Z
2021-05-28T03:31:18.046Z
<p>最近使用 <code>Ubuntu 18.04</code> 作为台式机的办公系统,需要使用串口调试功能,于是安装了 <code>minicom</code>, 但是配置波特率的时候发现无法配置高于 <code>1000000</code> 以上波特率。</p>
<pre><code class="bash">$ sudo stty -F /dev/ttyUSB0 1500000
stty: /dev/ttyUSB0: unable to perform all requested operations
</code></pre>
基于 IPQ807x 编译 QSDK
https://www.litreily.top/2021/02/07/qsdk-compile/
2021-02-07T06:19:04.000Z
2021-05-28T03:12:11.503Z
<p>接上一篇 <a href="https://www.litreily.top/2021/01/29/qsdk/">下载安装基于 openwrt 的 QSDK</a>, 这一篇来讲下编译 <code>QSDK</code> 的步骤以及遇到的问题及其处理方法。</p>
<p>正常步骤,是下面这样的,根据设备类型选择 config 文件,生成 .config, 然后完整编译。</p>
<pre><code class="bash">cp qca/configs/qsdk/ipq_open.config .config
echo CONFIG_TARGET_ipq_ipq807x_64=y >> .config
echo CONFIG_TARGET_ipq_ipq807x_64_QSDK_Open=y >> .config
make package/symlinks
make defconfig
make V=s
</code></pre>
<p><code>make V=s</code> 之前的指令都能正常通过,但是编译过程中就可能出现各种情况,比如缺少编译工具等。</p>
<h2 id="依赖工具"><a href="#依赖工具" class="headerlink" title="依赖工具"></a>依赖工具</h2><p>每个人的编译环境可能
下载安装基于 openwrt 的 QSDK
https://www.litreily.top/2021/01/29/qsdk/
2021-01-29T09:29:56.000Z
2021-05-28T03:12:11.503Z
<p><code>QSDK</code> - QCA Software Development Kits, 基于 openwrt 加入了 QCA 相关的代码库,可以用于使用 qualcomm 芯片的路由器固件开发。本文讲述如何获取 QSDK.</p>
<p>我们通常会使用 <code>git clone</code> 获取开源项目的代码,比如 github, gitlab, coding 等平台,但是 <code>QSDK</code> 并不存放于这些平台,而是有它自己的维护站点,并且需要通过 <code>repo</code> 和 <code>git</code> 共同完成仓库文件的 <code>clone</code>, 下面来看看吧。</p>
<h2 id="install-repo"><a href="#install-repo" class="headerlink" title="install repo"></a>install repo</h2><p>首先来安装 <code>repo</code> 工具,这其实是个 <code>Python</code> 脚本.</p>
<pre><code class="bash">curl https://storage.googleapis.com/git-repo-downloads/repo -o repo
chmod +x
openwrt Makefile scan.mk 详解
https://www.litreily.top/2021/01/15/mk-scan/
2021-01-15T08:22:51.000Z
2021-05-28T03:12:11.503Z
<p><code>openwrt</code> 中的 <code>include/scan.mk</code> 用于扫描项目 <code>package</code>, <code>target</code> 目录信息,并将扫描结果存入 <code>tmp</code> 目录。这个扫描过程几乎是 openwrt 所有目标生成的前提。也就是说,无论使用 <code>make</code> 编译 <code>openwrt</code> 哪个部分的代码,都会通过 <code>scan.mk</code> 生成必要的临时文件,这是编译其它目录的大前提。</p>
<p>举例说明,我们指定编译某个 <code>package</code> 时,如 <code>package/utils/demo</code>,<code>make</code> 根据层层 <code>Makefile</code> 会去寻找该 <code>package</code> 的路径,而这个路径信息就是通过 <code>scan.mk</code> 扫描后存入了 <code>tmp</code> 目录。这样有什么好处呢? 我完全可以手动执行 <code>make package/utils/demo/compile</code> 不是吗?</p>
<p>的确如此,但是我们不可能每次都去写长串的路径,通过 <code>
openwrt Makefile subdir.mk 详解
https://www.litreily.top/2021/01/13/mk-subdir/
2021-01-13T08:25:37.000Z
2021-05-28T03:12:11.503Z
<p>之前讲述了 openwrt Makefile 的<a href="https://www.litreily.top/2020/12/30/openwrt-mkfile/">整体框架</a>,主要包括主 Makefile 的描述,,最后简单描述了 <code>subdir.mk</code> , 本文就来详细剖析这个文件。</p>
<p>但是在解析 <code>subdir.mk</code> 之前,先来看两个 Makefile, </p>
<ul>
<li><code>debug.mk</code>: 这也是主 Makefile 引入的第一个 .mk 文件,这里定义的调试函数在 <code>subdir.mk</code> 中被调用</li>
<li><code>target/Makefile</code>: 这是调用到 <code>subdir.mk</code> 的首个 Makefile, 本文将以此为例进行说明</li>
</ul>
<h2 id="debug-mk"><a href="#debug-mk" class="headerlink" title="debug.mk"></a>debug.mk</h2><p><code>debug.mk</code> 定义了几个调试函数。</p>
<ul>
<li><code>debug</code></li>
<li><co
openwrt Makefile 框架分析
https://www.litreily.top/2020/12/30/openwrt-mkfile/
2020-12-30T00:49:20.000Z
2021-05-28T03:12:11.503Z
<p>openwrt repo: <a href="https://github.com/openwrt/openwrt">https://github.com/openwrt/openwrt</a></p>
<h2 id="整体框架"><a href="#整体框架" class="headerlink" title="整体框架"></a>整体框架</h2><p><img src="/assets/openwrt/openwrt_arch.png" alt="openwrt arch"></p>
<ul>
<li>首行为buildroot默认目录<ul>
<li>config: 配置文件</li>
<li>include: openwrt 的 Makefile 文件</li>
<li>package: 各个软件包的Makefile, patches等文件</li>
<li>scripts: openwrt 包管理相关的 perl 脚本</li>
<li>target: 用于编译 kernel 和 firmware 的相关文件</li>
<li>toolchain: 包含用于获取 kernel headers, C lib, bin-utils, compiler, debugger 的指令</li>
<li>tools: 包含编译时所需的一些工具,如automake, autoco
openwrt make defconfig 详解
https://www.litreily.top/2020/12/29/make-defconfig/
2020-12-29T01:47:32.000Z
2021-05-28T03:12:11.503Z
<p>对于 linux kernel,有几个常用 make 指令用于生成 .config 文件。</p>
<ul>
<li>make oldconfig</li>
<li>make menuconfig</li>
<li>make defconfig</li>
<li>make config</li>
</ul>
<p>那么这些指令具体执行了什么操作呢,针对 openwrt 来看下吧。</p>
<h2 id="主-Makefile"><a href="#主-Makefile" class="headerlink" title="主 Makefile"></a>主 Makefile</h2><p>在 buildroot 执行 make,首先会访问仓库根目录的主 <a href="https://github.com/openwrt/openwrt/blob/master/Makefile">Makefile</a>,其中有个 ifneq 判断如下:</p>
<pre><code class="makefile">ifneq ($(OPENWRT_BUILD),1)
_SINGLE=export MAKEFLAGS=$(space);
override OPENWRT_BUILD=1
export OPENWRT_BUILD
GREP_OPTIONS=
expor
lua 高级特性
https://www.litreily.top/2020/12/25/lua-adv/
2020-12-25T02:08:01.000Z
2021-05-28T03:12:11.503Z
<p>这一篇来记录下 lua 的某些高级特性,以便在实际应用中得心应手。</p>
<h2 id="模块和包"><a href="#模块和包" class="headerlink" title="模块和包"></a>模块和包</h2><p>为了方便代码复用和扩展,可以使用 table 实现模块 module,在模块中封装通用代码。把同类型的函数放在一个文件中,然后在其它脚本中调用。</p>
<pre><code class="lua">module = {}
module.version = "V0.1"
module.author = "litreily"
function module.func1 ()
function-body
end
function module.func2 ()
function-body
end
return module
</code></pre>
<p>然后在其它文件通过 require 导入。</p>
<pre><code class="lua">require ("module")
-- or
require "module"
print(module.version)
module.func1()
-- or
loc
lua 基本语法
https://www.litreily.top/2020/12/24/lua-basic/
2020-12-24T03:19:14.000Z
2021-05-28T03:12:11.503Z
<h2 id="基本语法"><a href="#基本语法" class="headerlink" title="基本语法"></a>基本语法</h2><h3 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h3><pre><code class="lua">-- single line comment
--[[
mutil line comments
]]
</code></pre>