Compare commits
1 Commits
develop
...
BootLoader优化
| Author | SHA1 | Date | |
|---|---|---|---|
| 312c7e2926 |
@@ -0,0 +1,96 @@
|
|||||||
|
---
|
||||||
|
name: submodule-commit-push
|
||||||
|
description: 提交并推送含子模块的 Git 仓库(先子模块后父仓库,处理 detached HEAD / 落后远程等常见问题)
|
||||||
|
source: auto-skill
|
||||||
|
extracted_at: '2026-06-22T03:44:15.544Z'
|
||||||
|
---
|
||||||
|
|
||||||
|
# 提交并推送所有仓库(含子模块)
|
||||||
|
|
||||||
|
## 适用场景
|
||||||
|
项目包含多个 Git 子模块,需要将所有变更(子模块内文件删除/修改 + 父仓库指针更新)一次性提交并推送到远端。
|
||||||
|
|
||||||
|
## 核心原则
|
||||||
|
|
||||||
|
**子模块必须先于父仓库提交并推送**,否则父仓库的指针会指向尚未推送到远端的提交,导致其他人拉取失败。
|
||||||
|
|
||||||
|
## 操作流程
|
||||||
|
|
||||||
|
### 1. 检查整体状态
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <项目根目录>
|
||||||
|
git status # 查看父仓库变更
|
||||||
|
git submodule status # 查看子模块状态(+ 表示新提交,- 表示未初始化)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 逐个检查子模块
|
||||||
|
|
||||||
|
对每个有变更的子模块,进入目录检查:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <子模块路径>
|
||||||
|
git status
|
||||||
|
git diff HEAD --stat
|
||||||
|
git branch -a # 检查是否在 detached HEAD
|
||||||
|
git log -n 1 --oneline # 检查是否落后远端
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 处理子模块常见问题
|
||||||
|
|
||||||
|
| 问题 | 表现 | 解决方案 |
|
||||||
|
|------|------|----------|
|
||||||
|
| **落后远端** | `Your branch is behind 'origin/xxx' by N commits` | 先 `git stash` → `git pull` → `git stash pop`,再提交 |
|
||||||
|
| **detached HEAD** | 子模块不在任何分支上 | `git checkout -b develop` 或 `git checkout develop` 切到分支再提交 |
|
||||||
|
| **仅 modified content** | 父仓库显示 `modified content` 但子模块 `git status` 干净 | 子模块只有未提交的本地修改,需在子模块内 add + commit |
|
||||||
|
|
||||||
|
### 4. 提交并推送每个子模块
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <子模块路径>
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: 具体变更描述
|
||||||
|
|
||||||
|
- 文件1: 变更说明
|
||||||
|
- 文件2: 变更说明"
|
||||||
|
git push origin <分支名> # 首次推送新分支用 git push -u origin <分支名>
|
||||||
|
```
|
||||||
|
|
||||||
|
> **提交消息格式**:按用户偏好,需列出每个文件的变更说明,而非笼统总结。
|
||||||
|
|
||||||
|
### 5. 在父仓库更新子模块指针
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <项目根目录>
|
||||||
|
git add <子模块路径1> <子模块路径2> ...
|
||||||
|
git commit -m "chore: 更新子模块指针到最新提交
|
||||||
|
|
||||||
|
- 子模块1: 变更说明
|
||||||
|
- 子模块2: 变更说明"
|
||||||
|
git push origin <分支名>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <项目根目录>
|
||||||
|
git status # 应显示 nothing to commit, working tree clean
|
||||||
|
git submodule status # 所有子模块无 + 或 - 前缀
|
||||||
|
```
|
||||||
|
|
||||||
|
## 本项目子模块清单
|
||||||
|
|
||||||
|
| 子模块 | 路径 | 默认分支 | 远端地址 |
|
||||||
|
|--------|------|----------|----------|
|
||||||
|
| FatFS | `Project/GateWay/source/Module/FatFS` | master | 192.168.2.47 |
|
||||||
|
| GateWay_Debug | `Project/GateWay/source/Module/GateWay_Debug` | develop | 192.168.2.47 |
|
||||||
|
| SDCard | `Project/GateWay/source/Module/SDCard` | master | 192.168.2.47 |
|
||||||
|
| sx127x | `Project/GateWay/source/Module/sx127x` | develop | 192.168.2.47 |
|
||||||
|
|
||||||
|
> 父仓库 GateWay 的远端在 8.137.104.4,子模块的远端在 192.168.2.47(内网),注意网络可达性。
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 如果子模块只有指针变更(无文件级修改),说明子模块已有新提交但父仓库指针未更新,只需在父仓库 `git add <子模块路径>` 即可
|
||||||
|
- FatFS 子模块容易因为 documents/ 目录产生大量 untracked 文件冲突,`git stash` 时加 `--include-untracked`
|
||||||
|
- sx127x 经常处于 detached HEAD 状态,操作前务必先切到 develop 分支
|
||||||
@@ -729,6 +729,18 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>14</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\source\User\Src\Update.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>Update.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
@@ -739,7 +751,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>14</FileNumber>
|
<FileNumber>15</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -751,7 +763,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>15</FileNumber>
|
<FileNumber>16</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -763,7 +775,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>16</FileNumber>
|
<FileNumber>17</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -775,7 +787,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>17</FileNumber>
|
<FileNumber>18</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -787,7 +799,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>18</FileNumber>
|
<FileNumber>19</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -799,7 +811,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>19</FileNumber>
|
<FileNumber>20</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -811,7 +823,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>20</FileNumber>
|
<FileNumber>21</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -823,7 +835,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>21</FileNumber>
|
<FileNumber>22</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -835,7 +847,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>22</FileNumber>
|
<FileNumber>23</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -847,7 +859,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>23</FileNumber>
|
<FileNumber>24</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -859,7 +871,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>24</FileNumber>
|
<FileNumber>25</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -871,7 +883,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>25</FileNumber>
|
<FileNumber>26</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -883,7 +895,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>26</FileNumber>
|
<FileNumber>27</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -895,7 +907,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>27</FileNumber>
|
<FileNumber>28</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -907,7 +919,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>28</FileNumber>
|
<FileNumber>29</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -919,7 +931,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>29</FileNumber>
|
<FileNumber>30</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -931,7 +943,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>30</FileNumber>
|
<FileNumber>31</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -951,7 +963,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>31</FileNumber>
|
<FileNumber>32</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -971,7 +983,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>32</FileNumber>
|
<FileNumber>33</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -983,7 +995,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>33</FileNumber>
|
<FileNumber>34</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -1003,7 +1015,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>34</FileNumber>
|
<FileNumber>35</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -1015,7 +1027,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>35</FileNumber>
|
<FileNumber>36</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -1027,7 +1039,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>36</FileNumber>
|
<FileNumber>37</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -1039,7 +1051,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>37</FileNumber>
|
<FileNumber>38</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@@ -1059,12 +1071,12 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>38</FileNumber>
|
<FileNumber>39</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>..\source\Module\SX127x\sx127x.c</PathWithFileName>
|
<PathWithFileName>..\..\..\..\Module\SX127x\sx127x.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>sx127x.c</FilenameWithoutPath>
|
<FilenameWithoutPath>sx127x.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
|
|||||||
@@ -493,6 +493,11 @@
|
|||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\source\User\Src\utils.c</FilePath>
|
<FilePath>..\source\User\Src\utils.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Update.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\source\User\Src\Update.c</FilePath>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
@@ -779,7 +784,7 @@
|
|||||||
<File>
|
<File>
|
||||||
<FileName>sx127x.c</FileName>
|
<FileName>sx127x.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\source\Module\SX127x\sx127x.c</FilePath>
|
<FilePath>..\..\..\..\Module\SX127x\sx127x.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
@@ -1267,7 +1272,7 @@
|
|||||||
<MiscControls>--diag_suppress=186,66</MiscControls>
|
<MiscControls>--diag_suppress=186,66</MiscControls>
|
||||||
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA,BOOT_ENABLE</Define>
|
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA,BOOT_ENABLE</Define>
|
||||||
<Undefine></Undefine>
|
<Undefine></Undefine>
|
||||||
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
|
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\User\Src;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
|
||||||
</VariousControls>
|
</VariousControls>
|
||||||
</Cads>
|
</Cads>
|
||||||
<Aads>
|
<Aads>
|
||||||
@@ -1419,6 +1424,11 @@
|
|||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\source\User\Src\utils.c</FilePath>
|
<FilePath>..\source\User\Src\utils.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Update.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\source\User\Src\Update.c</FilePath>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
@@ -1705,7 +1715,7 @@
|
|||||||
<File>
|
<File>
|
||||||
<FileName>sx127x.c</FileName>
|
<FileName>sx127x.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\source\Module\SX127x\sx127x.c</FilePath>
|
<FilePath>..\..\..\..\Module\SX127x\sx127x.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
|
|||||||
Submodule Project/GateWay/source/Module/GateWay_Debug updated: a57b9ddf31...5c414595cc
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#define LORA_LOWPOWER //LORA低功耗设备,采用主动上报方式
|
#define LORA_LOWPOWER //LORA低功耗设备,采用主动上报方式
|
||||||
|
|
||||||
|
#define CRC16_BASE 0xA001
|
||||||
|
|
||||||
#define SENSOR_DATA_LEN_MAX 50
|
#define SENSOR_DATA_LEN_MAX 50
|
||||||
#define SENSOR_NUM_MAX 16
|
#define SENSOR_NUM_MAX 16
|
||||||
#define COMMUNIT_NUM_MAX 32
|
#define COMMUNIT_NUM_MAX 32
|
||||||
@@ -315,6 +317,7 @@ struct GateWay_t{
|
|||||||
};
|
};
|
||||||
|
|
||||||
int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
||||||
|
void Cat1UpgradeSetEnable(bool enable);
|
||||||
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length);
|
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length);
|
||||||
uint8_t AsciiToHex(char *ASCData, uint8_t *HexData, uint8_t sLen);
|
uint8_t AsciiToHex(char *ASCData, uint8_t *HexData, uint8_t sLen);
|
||||||
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen);
|
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen);
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef __UPDATE_H
|
||||||
|
#define __UPDATE_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "bsp.h"
|
||||||
|
|
||||||
|
/*启动标志定义*/
|
||||||
|
#define APP_START_FLAG 0x55AA5A5A
|
||||||
|
#define APP_UPDATE_FLAG 0xA5A5AA55
|
||||||
|
|
||||||
|
/*主机下发升级请求载荷结构体*/
|
||||||
|
typedef struct {
|
||||||
|
uint16_t PackageNum;
|
||||||
|
uint32_t AppSize;
|
||||||
|
uint32_t AppCrc32;
|
||||||
|
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
|
||||||
|
|
||||||
|
/*帧头结构体 - 与BootLoader协议一致*/
|
||||||
|
typedef struct {
|
||||||
|
uint8_t Header; // 0x7D
|
||||||
|
uint8_t DevMac[6]; // 设备MAC地址
|
||||||
|
uint8_t Cmd; // 命令码
|
||||||
|
uint8_t PayloadLen; // 载荷长度
|
||||||
|
}__attribute__((packed))UpdateFrameHeader_t, *pUpdateFrameHeader;
|
||||||
|
|
||||||
|
/*升级命令码*/
|
||||||
|
typedef enum {
|
||||||
|
INSIDE_CMD_UPDATE = 0x81, // 升级程序下发请求
|
||||||
|
}INSIDE_CMD_M;
|
||||||
|
|
||||||
|
/*内部指令状态机*/
|
||||||
|
typedef enum {
|
||||||
|
IN_STATUS_IDLE,
|
||||||
|
IN_STATUS_UPDATE,
|
||||||
|
}InStatus_m;
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: Update
|
||||||
|
* 功能描述: 固件升级 - 解析到升级指令后调用此函数
|
||||||
|
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
void Update(uint8_t *PayLoad);
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: UpdateInit
|
||||||
|
* 功能描述: 升级参数初始化 - 需要在程序启动,外设初始化完后调用
|
||||||
|
* 参 数: 无
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
void UpdateInit(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "hc32_ddl.h"
|
#include "hc32_ddl.h"
|
||||||
#include "rtthread.h"
|
#include "rtthread.h"
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
|
|
||||||
#define SOFTWARE_VERSION 10
|
#define SOFTWARE_VERSION 10
|
||||||
#define HARDWARE_VERSION 12
|
#define HARDWARE_VERSION 12
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "CatOneTask.h"
|
#include "CatOneTask.h"
|
||||||
#include "DebugCmd.h"
|
#include "DebugCmd.h"
|
||||||
|
#include "Update.h"
|
||||||
|
|
||||||
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
|
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
|
||||||
|
|
||||||
@@ -9,6 +10,14 @@ static rt_sem_t LoraDioIRQ_Sem = RT_NULL;
|
|||||||
static rt_thread_t LoraIRQ_Thread = RT_NULL;
|
static rt_thread_t LoraIRQ_Thread = RT_NULL;
|
||||||
static GateWayPara GateWay;
|
static GateWayPara GateWay;
|
||||||
|
|
||||||
|
/*Lora通道升级相关变量*/
|
||||||
|
static InStatus_m s_LoraInStatus = IN_STATUS_IDLE;
|
||||||
|
static uint8_t s_LoraInsidePay[256];
|
||||||
|
static uint8_t s_LoraInsidePayLen = 0;
|
||||||
|
static bool s_LoraUpgradeEnable = false;
|
||||||
|
static void LoraInSideCmdHandler(uint8_t *rData, uint16_t rLen);
|
||||||
|
static void LoraInSideLoopHandler(void);
|
||||||
|
|
||||||
void LoraSend(uint8_t* pucBuff, uint8_t ucLen)
|
void LoraSend(uint8_t* pucBuff, uint8_t ucLen)
|
||||||
{
|
{
|
||||||
Sx1276LoRaSendBuffer(pucBuff, ucLen);
|
Sx1276LoRaSendBuffer(pucBuff, ucLen);
|
||||||
@@ -98,6 +107,10 @@ void Lora_Thread_Entry(void *parameter)
|
|||||||
|
|
||||||
Sx1276LoRaInit(LoraRevCallBack);
|
Sx1276LoRaInit(LoraRevCallBack);
|
||||||
Debug_Printf("Lora Thread is running!\r\n");
|
Debug_Printf("Lora Thread is running!\r\n");
|
||||||
|
|
||||||
|
/*启用Lora通道升级功能*/
|
||||||
|
s_LoraUpgradeEnable = true;
|
||||||
|
|
||||||
#ifdef LORA_LOWPOWER
|
#ifdef LORA_LOWPOWER
|
||||||
while(1) {
|
while(1) {
|
||||||
if(GateWay->ConfigPara.Lora.OnOff == false) {
|
if(GateWay->ConfigPara.Lora.OnOff == false) {
|
||||||
@@ -107,9 +120,19 @@ void Lora_Thread_Entry(void *parameter)
|
|||||||
|
|
||||||
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
|
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
|
||||||
if(result == RT_EOK) {
|
if(result == RT_EOK) {
|
||||||
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
|
/*内部指令处理(升级帧头0x7D)*/
|
||||||
if(ret == 0xff) //注册信息
|
if(Payload[1] == 0x7D && s_LoraUpgradeEnable) {
|
||||||
continue;
|
LoraInSideCmdHandler(&Payload[1], Payload[0]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/*内部指令状态机处理*/
|
||||||
|
LoraInSideLoopHandler();
|
||||||
|
|
||||||
|
/*正常通讯单元数据处理*/
|
||||||
|
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
|
||||||
|
if(ret == 0xff) //注册信息
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else { //离线判断
|
else { //离线判断
|
||||||
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
|
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
|
||||||
@@ -210,3 +233,79 @@ void LoraInit(void)
|
|||||||
{
|
{
|
||||||
Sx1276LoRaInit(LoraRevCallBack);
|
Sx1276LoRaInit(LoraRevCallBack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: LoraInSideCmdHandler
|
||||||
|
* 功能描述: Lora通道内部指令处理函数
|
||||||
|
* 参 数: rData 接收数据
|
||||||
|
rLen 数据长度
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void LoraInSideCmdHandler(uint8_t *rData, uint16_t rLen)
|
||||||
|
{
|
||||||
|
uint16_t crc16, Check;
|
||||||
|
uint8_t *Payload;
|
||||||
|
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
|
||||||
|
|
||||||
|
/*CRC校验*/
|
||||||
|
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
|
||||||
|
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
|
||||||
|
if(Check != crc16) {
|
||||||
|
Debug_Printf("Lora Inside CRC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*检查设备MAC是否匹配(支持广播0xFF)*/
|
||||||
|
bool isMatch = false;
|
||||||
|
for(int i = 0; i < 6; i++) {
|
||||||
|
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
|
||||||
|
if(IFHeader->DevMac[i] == 0xFF) {
|
||||||
|
isMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isMatch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isMatch) {
|
||||||
|
Debug_Printf("Lora Inside MAC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Payload = &rData[sizeof(UpdateFrameHeader_t)];
|
||||||
|
s_LoraInsidePayLen = IFHeader->PayloadLen;
|
||||||
|
|
||||||
|
switch((INSIDE_CMD_M)IFHeader->Cmd) {
|
||||||
|
case INSIDE_CMD_UPDATE: {
|
||||||
|
memcpy(s_LoraInsidePay, Payload, s_LoraInsidePayLen);
|
||||||
|
s_LoraInStatus = IN_STATUS_UPDATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: LoraInSideLoopHandler
|
||||||
|
* 功能描述: Lora通道内部指令状态机处理函数
|
||||||
|
* 参 数: 无
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void LoraInSideLoopHandler(void)
|
||||||
|
{
|
||||||
|
switch(s_LoraInStatus) {
|
||||||
|
case IN_STATUS_IDLE: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case IN_STATUS_UPDATE: {
|
||||||
|
Update(s_LoraInsidePay);
|
||||||
|
memset(s_LoraInsidePay, 0, sizeof(s_LoraInsidePay));
|
||||||
|
s_LoraInStatus = IN_STATUS_IDLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,8 +4,17 @@
|
|||||||
#include "LoraTask.h"
|
#include "LoraTask.h"
|
||||||
#include "spiflash.h"
|
#include "spiflash.h"
|
||||||
#include "CatOneTask.h"
|
#include "CatOneTask.h"
|
||||||
|
#include "Update.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*Cat1/LAN通道升级相关变量*/
|
||||||
|
static InStatus_m s_Cat1InStatus = IN_STATUS_IDLE;
|
||||||
|
static uint8_t s_Cat1InsidePay[256];
|
||||||
|
static uint8_t s_Cat1InsidePayLen = 0;
|
||||||
|
static bool s_Cat1UpgradeEnable = false;
|
||||||
|
static void Cat1InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay);
|
||||||
|
static void Cat1InSideLoopHandler(void);
|
||||||
|
|
||||||
//传感器对应的数据长度
|
//传感器对应的数据长度
|
||||||
const uint8_t SensorTypeDataLen[] = {
|
const uint8_t SensorTypeDataLen[] = {
|
||||||
0, //0x0000-保留
|
0, //0x0000-保留
|
||||||
@@ -861,14 +870,26 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
|
|||||||
uint8_t *Data;
|
uint8_t *Data;
|
||||||
uint8_t *MegData;
|
uint8_t *MegData;
|
||||||
uint8_t sLen;
|
uint8_t sLen;
|
||||||
|
|
||||||
uint8_t CommUintMac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
uint8_t CommUintMac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
NetCommFrameHeader NCHeader = (NetCommFrameHeader)rData;
|
NetCommFrameHeader NCHeader = (NetCommFrameHeader)rData;
|
||||||
|
|
||||||
uint16_t FrameLen = sizeof(NetCommFrameHeader_t) + NCHeader->PayloadLen;
|
uint16_t FrameLen = sizeof(NetCommFrameHeader_t) + NCHeader->PayloadLen;
|
||||||
if(FrameLen > CAT_ONE_REV_LEN_MAX)
|
if(FrameLen > CAT_ONE_REV_LEN_MAX)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/*Cat1/LAN通道升级处理 - 新协议帧头0x7D*/
|
||||||
|
if(NCHeader->Header == 0x7D && s_Cat1UpgradeEnable) {
|
||||||
|
/*内部指令状态机处理*/
|
||||||
|
Cat1InSideLoopHandler();
|
||||||
|
Cat1InSideCmdHandler(rData, rLen, GateWay);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*内部指令状态机处理*/
|
||||||
|
Cat1InSideLoopHandler();
|
||||||
|
|
||||||
if(NCHeader->Header != 0x7A)
|
if(NCHeader->Header != 0x7A)
|
||||||
return -1;
|
return -1;
|
||||||
if(memcmp(NCHeader->GWMac, GateWay->ConfigPara.GwMac, 6) != 0x00)
|
if(memcmp(NCHeader->GWMac, GateWay->ConfigPara.GwMac, 6) != 0x00)
|
||||||
@@ -1212,3 +1233,91 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: Cat1InSideCmdHandler
|
||||||
|
* 功能描述: Cat1/LAN通道内部指令处理函数
|
||||||
|
* 参 数: rData 接收数据
|
||||||
|
rLen 数据长度
|
||||||
|
GateWay 网关参数句柄
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void Cat1InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay)
|
||||||
|
{
|
||||||
|
uint16_t crc16, Check;
|
||||||
|
uint8_t *Payload;
|
||||||
|
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
|
||||||
|
|
||||||
|
/*CRC校验*/
|
||||||
|
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
|
||||||
|
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
|
||||||
|
if(Check != crc16) {
|
||||||
|
Debug_Printf("Cat1 Inside CRC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*检查设备MAC是否匹配(支持广播0xFF)*/
|
||||||
|
bool isMatch = false;
|
||||||
|
for(int i = 0; i < 6; i++) {
|
||||||
|
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
|
||||||
|
if(IFHeader->DevMac[i] == 0xFF) {
|
||||||
|
isMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isMatch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isMatch) {
|
||||||
|
Debug_Printf("Cat1 Inside MAC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Payload = &rData[sizeof(UpdateFrameHeader_t)];
|
||||||
|
s_Cat1InsidePayLen = IFHeader->PayloadLen;
|
||||||
|
|
||||||
|
switch((INSIDE_CMD_M)IFHeader->Cmd) {
|
||||||
|
case INSIDE_CMD_UPDATE: {
|
||||||
|
memcpy(s_Cat1InsidePay, Payload, s_Cat1InsidePayLen);
|
||||||
|
s_Cat1InStatus = IN_STATUS_UPDATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: Cat1InSideLoopHandler
|
||||||
|
* 功能描述: Cat1/LAN通道内部指令状态机处理函数
|
||||||
|
* 参 数: 无
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void Cat1InSideLoopHandler(void)
|
||||||
|
{
|
||||||
|
switch(s_Cat1InStatus) {
|
||||||
|
case IN_STATUS_IDLE: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case IN_STATUS_UPDATE: {
|
||||||
|
Update(s_Cat1InsidePay);
|
||||||
|
memset(s_Cat1InsidePay, 0, sizeof(s_Cat1InsidePay));
|
||||||
|
s_Cat1InStatus = IN_STATUS_IDLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: Cat1UpgradeSetEnable
|
||||||
|
* 功能描述: 设置Cat1/LAN通道升级使能
|
||||||
|
* 参 数: enable 使能标志
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
void Cat1UpgradeSetEnable(bool enable)
|
||||||
|
{
|
||||||
|
s_Cat1UpgradeEnable = enable;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,8 +5,18 @@
|
|||||||
#include "CatOneTask.h"
|
#include "CatOneTask.h"
|
||||||
#include "DebugCmd.h"
|
#include "DebugCmd.h"
|
||||||
#include "update_protocol.h"
|
#include "update_protocol.h"
|
||||||
|
#include "Update.h"
|
||||||
#include "bsp.h"
|
#include "bsp.h"
|
||||||
|
|
||||||
|
/*升级相关变量 - 使用Update.h中定义的InStatus_m类型*/
|
||||||
|
static InStatus_m s_InStatus = IN_STATUS_IDLE;
|
||||||
|
static uint8_t s_InsidePay[256];
|
||||||
|
static uint8_t s_InsidePayLen = 0;
|
||||||
|
|
||||||
|
/*静态函数声明*/
|
||||||
|
static void InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay, SensorCommPara SCPara);
|
||||||
|
static void InSideLoopHandler(GateWayPara GateWay, SensorCommPara SCPara);
|
||||||
|
|
||||||
//#define RS485_DBG_LOG(...) { if(RS485DispEn) Debug_Printf(__VA_ARGS__);}
|
//#define RS485_DBG_LOG(...) { if(RS485DispEn) Debug_Printf(__VA_ARGS__);}
|
||||||
|
|
||||||
//static uint8_t RS485DispEn = false;
|
//static uint8_t RS485DispEn = false;
|
||||||
@@ -260,12 +270,15 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
|||||||
rt_err_t result;
|
rt_err_t result;
|
||||||
uint8_t MegData[9];
|
uint8_t MegData[9];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if(RS485Ch->Enable == false) {
|
if(RS485Ch->Enable == false) {
|
||||||
rt_thread_delay(10);
|
rt_thread_delay(10);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*内部指令状态机处理(升级)*/
|
||||||
|
InSideLoopHandler(GateWay, SCPara);
|
||||||
|
|
||||||
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
|
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
|
||||||
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
|
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
|
||||||
if(SCPara->SensorCnt < SENSOR_NUM_MAX) {
|
if(SCPara->SensorCnt < SENSOR_NUM_MAX) {
|
||||||
@@ -365,7 +378,12 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
|||||||
RxLenTemp = SCPara->RS485RxLen;
|
RxLenTemp = SCPara->RS485RxLen;
|
||||||
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
|
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
|
||||||
SCPara->RS485RxLen = 0;
|
SCPara->RS485RxLen = 0;
|
||||||
if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级
|
|
||||||
|
/*内部指令处理(升级帧头0x7D)*/
|
||||||
|
if(RxBuffTemp[0] == 0x7D && RS485Ch->UpgradeEnable == true) {
|
||||||
|
InSideCmdHandler(RxBuffTemp, RxLenTemp, GateWay, SCPara);
|
||||||
|
}
|
||||||
|
else if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //旧版升级协议(兼容)
|
||||||
update_process(RxBuffTemp,RxLenTemp);
|
update_process(RxBuffTemp,RxLenTemp);
|
||||||
}
|
}
|
||||||
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
|
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
|
||||||
@@ -621,3 +639,85 @@ void RS485Ch2RxIrqCallback(uint8_t rData)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: InSideCmdHandler
|
||||||
|
* 功能描述: 内部指令处理函数(升级命令)
|
||||||
|
* 参 数: rData 接收数据
|
||||||
|
rLen 数据长度
|
||||||
|
GateWay 网关参数句柄
|
||||||
|
SCPara RS485通讯参数句柄
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay, SensorCommPara SCPara)
|
||||||
|
{
|
||||||
|
uint16_t crc16, Check;
|
||||||
|
uint8_t *Payload;
|
||||||
|
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
|
||||||
|
|
||||||
|
/*CRC校验*/
|
||||||
|
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
|
||||||
|
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
|
||||||
|
if(Check != crc16) {
|
||||||
|
Debug_Printf("Inside CRC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*检查设备MAC是否匹配(支持广播0xFF)*/
|
||||||
|
bool isMatch = false;
|
||||||
|
for(int i = 0; i < 6; i++) {
|
||||||
|
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
|
||||||
|
if(IFHeader->DevMac[i] == 0xFF) {
|
||||||
|
isMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isMatch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isMatch) {
|
||||||
|
Debug_Printf("Inside MAC Err...\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Payload = &rData[sizeof(UpdateFrameHeader_t)];
|
||||||
|
s_InsidePayLen = IFHeader->PayloadLen;
|
||||||
|
|
||||||
|
switch((INSIDE_CMD_M)IFHeader->Cmd) {
|
||||||
|
case INSIDE_CMD_UPDATE: {
|
||||||
|
/*保存升级数据并进入升级状态*/
|
||||||
|
memcpy(s_InsidePay, Payload, s_InsidePayLen);
|
||||||
|
s_InStatus = IN_STATUS_UPDATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: InSideLoopHandler
|
||||||
|
* 功能描述: 内部指令状态机处理函数
|
||||||
|
* 参 数: GateWay 网关参数句柄
|
||||||
|
SCPara RS485通讯参数句柄
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
static void InSideLoopHandler(GateWayPara GateWay, SensorCommPara SCPara)
|
||||||
|
{
|
||||||
|
switch(s_InStatus) {
|
||||||
|
case IN_STATUS_IDLE: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case IN_STATUS_UPDATE: {
|
||||||
|
/*调用升级处理函数*/
|
||||||
|
Update(s_InsidePay);
|
||||||
|
memset(s_InsidePay, 0, sizeof(s_InsidePay));
|
||||||
|
s_InStatus = IN_STATUS_IDLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#include "Update.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "bsp.h"
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
/*Boot参数存储地址定义*/
|
||||||
|
#define BOOT_PARA_ADDR FLASH_BINFO_BASE
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: Update
|
||||||
|
* 功能描述: 固件升级 - 此函数在解析到升级指令时调用
|
||||||
|
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
void Update(uint8_t *PayLoad)
|
||||||
|
{
|
||||||
|
UpDataRequset_t Req;
|
||||||
|
boot_para_t cfg = {0};
|
||||||
|
|
||||||
|
memcpy(&Req, PayLoad, sizeof(UpDataRequset_t));
|
||||||
|
cfg.AppFlag = 0;
|
||||||
|
cfg.UpdateFlag = APP_UPDATE_FLAG;
|
||||||
|
cfg.Crc32Check = Req.AppCrc32;
|
||||||
|
cfg.PackageNum = Req.PackageNum;
|
||||||
|
cfg.AppSize = Req.AppSize;
|
||||||
|
|
||||||
|
Debug_Printf("Receive upgrade command:\r\n");
|
||||||
|
Debug_Printf("PackageNum: %d\r\n", cfg.PackageNum);
|
||||||
|
Debug_Printf("AppSize: %d\r\n", cfg.AppSize);
|
||||||
|
Debug_Printf("AppCrc32: 0x%08x\r\n", cfg.Crc32Check);
|
||||||
|
Debug_Printf("System Reset!\r\n");
|
||||||
|
|
||||||
|
/*保存启动参数到Flash*/
|
||||||
|
dev_boot_write_param(cfg);
|
||||||
|
|
||||||
|
/*延时后复位*/
|
||||||
|
rt_thread_mdelay(200);
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************************
|
||||||
|
* 函数名称: UpdateInit
|
||||||
|
* 功能描述: 升级参数初始化 - 需要在程序启动,外设初始化完后调用
|
||||||
|
* 参 数: 无
|
||||||
|
* 返 回 值: 无
|
||||||
|
*****************************************************************************************/
|
||||||
|
void UpdateInit(void)
|
||||||
|
{
|
||||||
|
boot_para_t cfg = {0};
|
||||||
|
|
||||||
|
/*读取启动参数*/
|
||||||
|
dev_boot_read_param(&cfg);
|
||||||
|
|
||||||
|
/*如果是首次运行,设置APP启动标志*/
|
||||||
|
if(cfg.AppFlag != APP_START_FLAG) {
|
||||||
|
cfg.AppFlag = APP_START_FLAG;
|
||||||
|
dev_boot_write_param(cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -178,7 +178,7 @@ void GateWayInit(void)
|
|||||||
GateWay.ConfigPara.Rs485Ch1.Power = false;
|
GateWay.ConfigPara.Rs485Ch1.Power = false;
|
||||||
GateWay.ConfigPara.Rs485Ch2.Enable = true;
|
GateWay.ConfigPara.Rs485Ch2.Enable = true;
|
||||||
GateWay.ConfigPara.Rs485Ch2.BaudRate = 500000;
|
GateWay.ConfigPara.Rs485Ch2.BaudRate = 500000;
|
||||||
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = false;
|
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = true; // 启用Ch2升级
|
||||||
GateWay.ConfigPara.Rs485Ch2.CommUnitEnable = false;
|
GateWay.ConfigPara.Rs485Ch2.CommUnitEnable = false;
|
||||||
GateWay.ConfigPara.Rs485Ch2.Power = false;
|
GateWay.ConfigPara.Rs485Ch2.Power = false;
|
||||||
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
|
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
|
||||||
@@ -394,6 +394,9 @@ int main(void)
|
|||||||
GateWay.CommUnitRevCallBack = CommUnitAnalyze;
|
GateWay.CommUnitRevCallBack = CommUnitAnalyze;
|
||||||
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
|
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
|
||||||
|
|
||||||
|
/*启用Cat1/LAN通道升级功能*/
|
||||||
|
Cat1UpgradeSetEnable(true);
|
||||||
|
|
||||||
GateWay.NetSendData_MQ = rt_mq_create("NetSendMQ", 512, 10, RT_IPC_FLAG_FIFO);
|
GateWay.NetSendData_MQ = rt_mq_create("NetSendMQ", 512, 10, RT_IPC_FLAG_FIFO);
|
||||||
if(GateWay.NetSendData_MQ == RT_NULL) {
|
if(GateWay.NetSendData_MQ == RT_NULL) {
|
||||||
rt_kprintf("CatOne MQ Create Failed!\r\n");
|
rt_kprintf("CatOne MQ Create Failed!\r\n");
|
||||||
@@ -428,6 +431,9 @@ int main(void)
|
|||||||
rt_thread_startup(Debug_Thread);
|
rt_thread_startup(Debug_Thread);
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/*启用Debug通道升级功能*/
|
||||||
|
DebugUpgradeSetEnable(true);
|
||||||
|
|
||||||
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
|
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
|
||||||
if (Cat1Eth_Thread != RT_NULL)
|
if (Cat1Eth_Thread != RT_NULL)
|
||||||
|
|||||||
Reference in New Issue
Block a user