# 可用模式
## 总结
|模式|用途|设备树|保留分区|全盘|
|-|-|-|-|-|
|d2e|通过DTB生成迂腐EPT|X|√|√|
|e2d|通过EPT生成DTB|X|√|√|
|epedantic|检查EPT是否迂腐|X|√|√|
|dedit|编辑DTB里的分区，必要的话更新EPT|√|√|√|
|eedit|编辑EPT，必要的话更新DTB|X|√|√|
|dsnapshot|获取DTB分区的快照|√|√|√|
|esnapshot|获取EPT的快照|X|√|√|
|webreport|通过[ampart-web-reporter]汇报分区|X|√|√|
|dclone|恢复一个通过dsnapshot模式获得的快照|√|√|√|
|eclone|恢复一个通过esnapshot模式获得的快照|X|√|√|
|ecreate|简单地从头创建分区表|X|√|√|

_设备树， 保留分区， 全盘 三列表示该模式是否接受操作此类内容的文件/块设备_

所有模式都以 _**模式选择名** (全名)_ 的风格列出

## d2e (DTB转化为迂腐EPT)
根据DTB里面的分区节点构建迂腐EPT，和Amlogic的u-boot行为一致

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
 - 设备树 X
 - Reserved / 保留分区 √
 - 全盘 √

### 可能的故障点:
 - 如果DTB里不存在分区节点，迂腐EPT不会被创建。可能因为你用过旧版本的ampart，或者是ceemmc来修改过EPT而造成。这些方案会把DTB里面的分区节点移除，来避免Amlogic的u-boot来通过DTB还原EPT
 - 如果存在多个DTB，但不能保证构建相同的EPT，任何构建的EPT都不会被使用

## e2d (迂腐EPT转化为DTB)
根据一个迂腐EPT来还原/重建DTB里的分区节点

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √

### 可能的失败点:
 - 如果EPT不迂腐，不论原因为何，不会构建任何DTB

## epedantic (EPT迂腐吗)
检查EPT是否是一个迂腐EPT，并且给出建议怎么让它变得迂腐

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
 - 设备树 X
 - 保留分区 √
 - 全盘 √

## dedit (设备树编辑模式)
编辑DTB里的分区节点，并更新DTB。如果目标是保留分区或者全盘，且对应的迂腐EPT和现存的不同，也更新EPT。

### 分区参数:
 - 定义器： {名称}::{大小}:{掩码}  
   - {名称}必须明确设置
   - ~~{偏移}~~ 必须**不能**被设置
   - {大小}必须明确以绝对值设置
   - {掩码}必须明确设置
 - 修改器: ^{选择器}{操作符}{后缀}
   - 选择器 {选择器}必需被明确设置
     - 名称选择器 {名称} 必需是现存的分区名
     - 相对选择器 {相对} 
       - 非负相对选择器从开头选取（0选择第一个）
       - 负相对选择器从结尾选取（-1选择最后一个）
   - 操作符 {操作符}
     - 删除操作符 ?
     - 克隆操作符%
       - 后缀：克隆器 {名称}
         - {名称} 必需被明确设定
     - 移位操作符 @
       - 后缀：移位器 {移位}
         - 绝对移位器 (=){非负数} / ={负数}
           - 正向绝对移位器 (=){非负数}，0移位到第一个
           - 逆向移位器 ={负数}，-1移位到最后一个
         - 相对移位器 +{非负数} / -{非负数}
           - 向右相对移位器 +{非负数}
           - 向左相对移位器 -{非负数}
     - 调整操作符 :
       - 后缀：调整器 {名称}::{大小}:{掩码}
         - {名称} 是可选的
         - ~~{偏移}~~必须**不能**被设置
         - {大小}是可选的
           - -{非负数}减小
           - +{非负数}增加
           - {非负数}设置
         - {掩码}是可选的

### 可接受内容
- 设备树 √
- 保留分区 √
- 全盘 √

## eedit (EPT编辑模式)
编辑EPT。如果结果的EPT是迂腐的话，也更新DTB里面的分区节点；否则，移除DTB里的分区节点

### 分区参数:
 - 定义器： {名称}:{偏移}:{大小}:{掩码} 
   - {名称}必须明确设置
   - {偏移}是可选的
     - +{非负数}对于上一分区结尾而言的相对偏移
     - {非负数}对于全盘而言的绝对偏移
   - {大小}是可选择，并且只应以绝对值的形式设置
     - 如果没有设置，自动填充剩余空间
   - {掩码}是可选的
     - 如果不设置，默认为4
 - 修改器: ^{选择器}{操作符}{后缀}
   - 选择器 {选择器}必需被明确设置
     - 名称选择器 {名称} 必需是现存的分区名
     - 相对选择器 {相对} 
       - 非负相对选择器从开头选取（0选择第一个）
       - 负相对选择器从结尾选取（-1选择最后一个）
   - 操作符 {操作符}
     - 删除操作符 ?
     - 克隆操作符%
       - 后缀：克隆器 {名称}
         - {名称} 必需被明确设定
     - 移位操作符 @
       - 后缀：移位器 {移位}
         - 绝对移位器 (=){非负数} / ={负数}
           - 正向绝对移位器 (=){非负数}，0移位到第一个
           - 逆向移位器 ={负数}，-1移位到最后一个
         - 相对移位器 +{非负数} / -{非负数}
           - 向右相对移位器 +{非负数}
           - 向左相对移位器 -{非负数}
     - 调整操作符 :
       - 后缀：调整器 {名称}:{偏移}:{大小}:{掩码}
         - {名称} 是可选的
         - {偏移} 是可选的
           - -{非负数}减小
           - +{非负数}增加
           - {非负数}设置
         - {大小} 是可选的
           - -{非负数}减小
           - +{非负数}增加
           - {非负数}设置
         - {掩码}是可选的

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √

### 例子:
 - ``ampart --mode eedit /dev/mmcblk0 ^-1? ^cache@=-1 ^-2:my_second_lastp::-1G: lastp:::``
   - ``^-1?``
     - 删除最后一个分区
   - ``^cache@=-1``
     - 把cache位移作为最后一个分区（旧位置后的分区左移）
   - ``^-2:my_second_lastp::-1G:`` 
     - 把倒数第二个分区改名位`my_second_lastp`，大小缩小1G
   - ``lastp:::``
     - 创建一个lastp分区，占用所有剩余空间

## dsnapshot (DTB快照模式)
获取DTB里分区节点的快照，并打印到标准输出，三个可以互换的快照以十进制，十六进制，人类可读（十进制）的顺序被`\n`分割（换行符）。快照之后可以在`dclone`模式里用来获得一致的分区

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
- 设备树 √
- 保留分区 √
- 全盘 √

## esnapshot (EPT快照模式)
获取EPT的快照，并打印到标准输出，三个可以互换的快照以十进制，十六进制，人类可读（十进制）的顺序被`\n`分割（换行符）。快照之后可以在`eclone`模式里用来获得一致的分区

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √

## webreport (网页汇报模式)
在标准输出上生成一个URL，可以在浏览器打开网页查看格式整齐的分区信息，由我的另一个项目[ampart-web-reporter]驱动。运行这一模式的设备本身不需要联网。

[ampart-web-reporter]: https://github.com/7Ji/ampart-web-reporter

### 分区参数:
 - 无（所有的分区参数都会被忽略）

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √

## dclone (DTB克隆模式)
恢复一个`dsnapshot`模式里获得的快照，或者如果你想的话也能定义分区。如果目标为保留分区或者全盘，并且对应的迂腐EPT和现存的EPT不同的话，EPT也会一并更新

### 分区参数
 - 定义器： {名称}::{大小}:{掩码}  
   - {名称}必须明确设置
   - ~~{偏移}~~ 必须**不能**被设置
   - {大小}必须明确以绝对值设置
     - 特别值`-1`意为自动填充
   - {掩码}必须明确设置

### 可接受内容
- 设备树 √
- 保留分区 √
- 全盘 √

### 笔记
在HK1 Rbox X4上，u-boot会从DTB里读取一些重要的分区信息，这也是我重写ampart来实现这个模式的主要原因。下面列出的三个data外的分区（``boot_a::64M:1 vbmeta_a::2M:1 vbmeta_system_a::2M:1``）是必要的分区
```
./ampart --mode dclone /dev/mmcblk0 --migrate all boot_a::64M:1 vbmeta_a::2M:1 vbmeta_system_a::2M:1 data::-1:4
```

## eclone (EPT克隆模式)
恢复`esnapshot`模式中获得的快照，或者如果你想的话也能定义分区。如果结果的EPT是迂腐的，也在对应的DTB里分区节点不同的情况下更新它；不然，移除DTB里的分区节点

### 分区参数:
 - 定义器： {名称}:{偏移}:{大小}:{掩码} 
   - {名称}必须明确设置
   - {偏移}必须以绝对值的形式明确设置  
   - {大小}必须以绝对值的形式明确设置
   - {掩码}必须明确设置

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √

## ecreate (EPT创建模式)
以一种梭哈的方式定义分区表，你不需要在乎重要分区，它们的信息会自动从旧分区表里获取并优化。DTB里的分区节点**一定会被移除**

### 分区参数:
 - 定义器： {名称}:{偏移}:{大小}:{掩码} 
   - {名称}必须明确设置
   - {偏移}是可选的
     - +{非负数}相对于上一分区结尾的相对偏移
     - {非负数}相对于全盘的绝对偏移
   - {大小}是可选的，且只应以绝对值的形式设定
     - 如果不设置，自动填充剩余空间
   - {掩码}是可选的
     - 如果不设置，默认为4

### 可接受内容
- 设备树 X
- 保留分区 √
- 全盘 √