# 获取源代码

```eval_rst
.. hint:: 请发邮件至toybrick@rock-chips.com索取。
```
源代码中没有rootfs.img,toybrick已编译好并预置多个deb包的rootfs.img,请通过发布的[固件](https://console.box.lenovo.com/l/O0onni)内获取。

### 源码打补丁

-  `ROOT_DIR`:Linux源代码SDK的工作目录;文档中所示的目录为`/home/toybrick/work/edge`。

- 需要在${ROOT_DIR}/rootfs/debian/initrd/ 和 ${ROOT_DIR}/rkbin/目录打上补丁才可以正常编译固件,补丁包在这里${ROOT_DIR}/patches/下的同名目录。

- 在${ROOT_DIR}/rootfs/debian/initrd/目录下打补丁可参考以下步骤:

  - 获取${ROOT_DIR}/patches/initrd/commit_base.txt的commit ID:

    ```
    cat ../../../patches/initrd/commit_base.txt
    ```

  - 复制commit那一行第二列的字符串,当前版本假设是0dfde98ba6aa1fa87a0efb0315b534b0742014d1,那么重置这个基线版本:

    ```
    git reset --hard 0dfde98ba6aa1fa87a0efb0315b534b0742014d1
    ```

  - 打上补丁:

    ```
    git am ../../../patches/initrd/*.patch
    ```

- 在${ROOT_DIR}/rkbin/目录下同理做类似步骤(cf04d2f1699570344d189b0e6ff2eeb3f532f16c这个Commit id根据具体情况修改):

  ```
  cat ../patches/rkbin/commit_base.txt
  git reset --hard cf04d2f1699570344d189b0e6ff2eeb3f532f16c
  git am ../patches/rkbin/*.patch
  ```

## rootfs.img说明

debian11根文件系统是由一系列的deb包组成。通过脚本从debian官方网站或镜像网站下载这些软件包即可构建debian11根文件系统。

debian的国内官方网站:http://ftp.cn.debian.org/debian

国内常用的、速度比较快的镜像网站:http://mirros.163.com/debian

获取源码包方式:修改/etc/apt/source.list 增加deb-src,指定Ubuntu发行版源代码地址。(详细信息参考debian论坛的说明或百度搜索下载debian包源码)

```eval_rst
.. caution:: 不推荐自主重新构建rootfs.img,建议在toybrick发布的rootfs.img上进行裁剪即可。
```

详细见后续 [制作客制化Debian11固件](#set_debian11) 章节

# 编译源代码

## 搭建系统环境

### 编译主机系统要求

- Ubuntu18.04及以上和Debian11版本,内存推荐16GB及以上。
- 系统的用户名不能有**中文字符**。
- 只能使用普通用户搭建开发环境,**不允许用root用户登录**,如需要root权限请使用`sudo`命令。

### 安装编译依赖基础软件

Debain系统安装依赖

```shell
sudo apt -y install python lz4 coreutils qemu qemu-user-static python3 \
devicetree-compiler clang bison flex lld libssl-dev bc genext2fs git make
```

Ubuntu系统安装依赖

```shell
sudo apt -y install python lz4 coreutils qemu qemu-user-static python3 \
device-tree-compiler clang bison flex lld libssl-dev bc genext2fs git make
```

## 编译配置

请在获取到的源代码的根目录下执行以下操作。`edge` 可执行文件预置在源代码的根目录下。

为了方便文档描述,约定如下变量定义:

- `BOARD`:开发板/产品型号;如`TB-RK3576D`开发板的型号是`TB-RK3576D`。
- `DTB`:内核设备树;如`TB-RK3576D`开发板的产品内核设备树是`rk3576-toybrick-d0-linux`。
- `ROOT_DIR`:Linux源代码SDK的工作目录;文档中所示的目录为`/home/toybrick/work/edge`。
- `CHIP`:开发板的芯片型号;当前Linux源代码支持的芯片型号为`rk3576`或`rk3576s`。
- `OUT_DIR`:编译生成的镜像路径`${ROOT_DIR}/out/${CHIP}/${BOARD}/images` ,如`TB-RK3576D`的路径为`/home/toybrick/work/edge/out/rk3576/TB-RK3576D/images`。

<a id='set_config'></a>

### 设置配置信息

执行如下执行命令,输入产品型号的序号(如:TB-RK3576D开发板所对应的序号为9)设置配置信息:

```shell
./edge set


[EDGE DEBUG] Board list:
> rk3588
  0. RK3588-EVB4
  1. TB-RK3588B0
  2. RK3588-EVB7
  3. TB-RK3588X0
  4. RK3588s-EVB1
  5. RK3588-EVB1
  6. TB-RK3588SD0
> rk3399pro
  7. TB-RK3399ProD
> rk3576
  8. TB-RK3576L1
  9. TB-RK3576D0
  10. RK3576-EVB1
> rk3568
  11. TB-RK3568X10
  12. TB-RK3568X0
  13. TB-RK3568SD0

Enter the number of the board: 9
```

```eval_rst
.. important:: 每次更新或修改相关代码后,请重新执行此命令,更新配置。
```
配置文件分别位于`vendor/common/config.json`以及`vendor/${CHIP}/${BOARD}/config.json`,详细说明请查[阅配置信息说明](#config_md)章节

### 查看配置信息

执行如下命令,查看当前配置信息:

```shell
./edge env

[EDGE DEBUG] root path: /home1/jax/rk-sd0-edge-sdk
[EDGE DEBUG] out path: /home1/jax/rk-sd0-edge-sdk/out/rk3576/TB-RK3576D0/images
[EDGE DEBUG] board: TB-RK3576D0
[EDGE DEBUG] chip: rk3576
[EDGE DEBUG] arch: arm64
[EDGE DEBUG] bootmode: flash
[EDGE DEBUG] hyper: not set
[EDGE DEBUG] > Secureboot:
[EDGE DEBUG]   enable: False
[EDGE DEBUG]   rollback: [0, 0]
[EDGE DEBUG]   burnkey: False
[EDGE DEBUG] > Partition:
[EDGE DEBUG]   vnvm: ['0x00000500', '0x00000500']
[EDGE DEBUG]   uboot: ['0x00000A00', '0x00000800']
[EDGE DEBUG]   boot: ['0x00001200', '-']
[EDGE DEBUG] > Uboot:
[EDGE DEBUG]   config: rk3576-toybrick-sd0
[EDGE DEBUG] > Kernel:
[EDGE DEBUG]   version: 6.10
[EDGE DEBUG]   config: rk3576_edge.config rk3576_toybrick.config rk3576_toybrick_sd0.config
[EDGE DEBUG]   dtbname: rk3576s-toybrick-d0-linux
[EDGE DEBUG]   size: 64
[EDGE DEBUG]   docker: False
[EDGE DEBUG]   debug: 0xfeb50000
[EDGE DEBUG] > Rootfs:
[EDGE DEBUG]   osname: debian
[EDGE DEBUG]   version: 11
[EDGE DEBUG]   type: gnome
[EDGE DEBUG]   apturl: http://repo.rock-chips.com
[EDGE DEBUG]   uuid: 614e0000-0000-4b53-8000-1d28000054a9
[EDGE DEBUG]   size: auto
[EDGE DEBUG]   user: toybrick
[EDGE DEBUG]   password: toybrick
[EDGE DEBUG]   relver: 1.1.0
[EDGE DEBUG]   key: GPG-KEY-ROCKCHIP
```

<a id='config_md'></a>

### 配置信息说明

#### 公共配置

公共配置保存在`vendor/common/config.json`,其中值为`not set`的配置项必须在《板级配置》中设置;其他配置项可根据实际需要在《板级配置》中修改。

##### kernel

1. config:内核menuconfig配置,默认值为`rk3576_edge.config`及`rk3576_tobrick.config`,编译时会加载`rockchip_linux_defconfig`、`rk3576_edge.config`和`rk3576_toybrick.config`。如果有需要增减内核配置可修改`kernel/linux-6.10/arch/arm64/configs/rk3576_toybrick_sd0.config`。

3. docker:默认值为`false`。false为关闭docker配置,True为打开docker配置。

#### 板级配置

公共配置保存在`vendor/${CHIP}/${BOARD}/config.json`,其值会覆盖公共配置的同名配置项的值。

| 名称   | 说明                                                         |
| ------ | ------------------------------------------------------------ |
| board  | 开发板或产品型号,其值必须和vendor/${CHIP}目录下的${BOARD}目录名一致 |
| chip   | 芯片型号,目前支持rk3576、rk3576SD等等                       |
| arch   | 芯片架构,目前支持的两颗芯片都是arm64                        |
| uboot  | 默认为rk3576-toybrick-sd0,如果有需要增减uboot配置可修改uboot/configs/rk3576-toybrick-sd0.config |
| kernel | linuxdtb:产品/开发板的内核设备树文件名,如RK3576D开发板的dtbname为rk3576s-toybrick-d0-linux |

#### 注意事项

1. 产品目录下的`config.json`只需要添加需要修改的字段即可。
2. edge脚本首先会加载`vendor/common/config.json`;然后加载`vendor/${CHIP}/${BOARD}/config.json`,更新相同字段的值。
3. RK3576和RK3576s芯片的配置信息里的kernel子集的chip值都设置为:**`rk3576`**。

## 镜像编译

以下操作请先设置好配置信息`./edge set`,请参考[设置配置信息](#set_config) 章节。

```eval_rst
.. attention:: rootfs.img未进行编译,rootfs.img可在发布固件内下载。若要生成自定义rootfs.img请参考后面制作客制化Debian11固件章节。
```
### 一键编译

执行如下命令编译所有镜像(包括MiniLoaderAll.bin,uboot.img,kernel.img,boot.img, rootfs.img),保存在OUT_DIR目录:

```shell
./edge build -a
```

### 编译Uboot镜像

执行如下命令编译生成MiniLoaderAll.bin和uboot.img镜像,保存在OUT_DIR目录:

```shell
./edge build -u
```

### 编译kernel镜像

执行如下命令编译生成boot_linux.img和resource.img,保存在OUT_DIR目录:

```shell
./edge build -k
```

### 查看编译帮助

查看支持的编译参数:

```shell
./edge build -h
```

<a id='set_debian11'></a>

# 制作客制化Debian11固件

当用户在TB-RK3576D开发板完成产品化软件部署后,可以按照本章节自主裁剪debian11固件,生产自定义rootfs.img,用于产品批量生产。

## 制作根文件系统

以下操作均直接在TB-RK3576D开发版用root权限执行,如下步骤制作根文件系统:

- 插入U盘(请确保足够容量),挂载U盘到/mnt目录:

  ```shell
  mount /dev/sda1 /mnt
  ```

- 打包根文件系统所有文件:

  ```shell
  cd /
  tar cvpfJ /mnt/rootfs.tar.xz * --exclude=mnt/
  ```
  
- 创建空文件系统并格式化为EXT4文件系统:

  ```shell
  dd if=/dev/zero of=/mnt/rootfs.img bs=2K count=3M   // 创建文件系统大小为6G(2K * 3M),用户可以修改count的大小设置文件系统大小
  mkfs.ext4 /mnt/rootfs.img
  ```

- 挂载空文件系统到/rootfs目录:

  ```shell
  mkdir /rootfs
  mount /mnt/rootfs.img /rootfs
  ```

- 解压打包文件到/rootfs目录

  ```shell
  tar xvpfJ /mnt/rootfs.tar.xz /rootfs
  ```

- 卸载/rootfs目录和U盘:

  ```shell
  umount /rootfs
  umount /mnt
  ```

至此得到rootfs.img于U盘内。