瀏覽代碼

[bsp/gd32] update gd32 i2c driver #10641

WangShun 2 周之前
父節點
當前提交
6a9d218e92

+ 2 - 3
bsp/gd32/arm/gd32h759i-eval/.config

@@ -104,11 +104,9 @@
 #
 # CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set
 # end of rt_strnlen options
-
-# CONFIG_RT_UTEST_TC_USING_KLIBC is not set
 # end of klibc options
 
-CONFIG_RT_NAME_MAX=8
+CONFIG_RT_NAME_MAX=16
 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set
 # CONFIG_RT_USING_NANO is not set
 # CONFIG_RT_USING_SMART is not set
@@ -1443,6 +1441,7 @@ CONFIG_BSP_USING_UART0=y
 # CONFIG_BSP_USING_UART1 is not set
 # CONFIG_BSP_USING_UART2 is not set
 # CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_I2C is not set
 # end of On-chip Peripheral Drivers
 
 #

+ 30 - 1
bsp/gd32/arm/gd32h759i-eval/board/Kconfig

@@ -69,8 +69,37 @@ menu "On-chip Peripheral Drivers"
 
         endif
 
-    source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig"
+    menuconfig BSP_USING_I2C
+        bool "Enable I2C"
+        default n
+        if BSP_USING_I2C
+            menuconfig BSP_USING_HARD_I2C
+                bool "Enable Hardware I2C"
+                default n
+                select RT_USING_I2C
+                if BSP_USING_HARD_I2C
+                    config BSP_USING_HARD_I2C0
+                        bool "Enable I2C0 Hardware BUS"
+                        default n                    
+                    config BSP_USING_HARD_I2C1
+                        bool "Enable I2C1 Hardware BUS"
+                        default n
+                    config BSP_USING_HARD_I2C2
+                        bool "Enable I2C2 Hardware BUS"
+                        default n
+                    config BSP_USING_HARD_I2C3
+                        bool "Enable I2C3 Hardware BUS"
+                        default n
+                    config BSP_USING_HARD_I2C4
+                        bool "Enable I2C4 Hardware BUS"
+                        default n
+                    config BSP_USING_HARD_I2C5
+                        bool "Enable I2C5 Hardware BUS"
+                        default n
+                endif
+        endif
 
+    source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig"        
 endmenu
 
 menu "Board extended module Drivers"

+ 208 - 189
bsp/gd32/arm/gd32h759i-eval/project.uvoptx

@@ -117,31 +117,6 @@
         <pMon>BIN\CMSIS_AGDI.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>ARMRTXEVENTFLAGS</Key>
-          <Name>-L70 -Z18 -C0 -M0 -T1</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGTARM</Key>
-          <Name>(1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>ARMDBGFLAGS</Key>
-          <Name></Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGUARM</Key>
-          <Name></Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>CMSIS_AGDI</Key>
-          <Name>-X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BD12477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD24000000 -FC2000 -FN1 -FF0GD32H7xx_3840KB.FLM -FS08000000 -FL03C0000 -FP0($$Device:GD32H759IM$Flash\GD32H7xx_3840KB.FLM)</Name>
-        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>UL2CM3</Key>
@@ -155,12 +130,12 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>0</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>1</viewmode>
+        <viewmode>0</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>
@@ -215,7 +190,7 @@
   </Group>
 
   <Group>
-    <GroupName>Compiler</GroupName>
+    <GroupName>at24cxx</GroupName>
     <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
@@ -227,14 +202,34 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
+      <PathWithFileName>packages\at24cxx-latest\at24cxx.c</PathWithFileName>
+      <FilenameWithoutPath>at24cxx.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Compiler</GroupName>
+    <tvExp>0</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
       <PathWithFileName>..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c</PathWithFileName>
       <FilenameWithoutPath>syscall_mem.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>3</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -245,8 +240,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>4</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -257,8 +252,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>5</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -269,8 +264,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>6</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -281,8 +276,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>7</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>8</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -293,8 +288,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>9</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -305,8 +300,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>10</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -325,8 +320,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -337,8 +332,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -349,8 +344,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -361,8 +356,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -373,8 +368,20 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>15</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\components\drivers\i2c\dev_soft_i2c.c</PathWithFileName>
+      <FilenameWithoutPath>dev_soft_i2c.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -385,8 +392,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -397,8 +404,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -409,8 +416,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -421,8 +428,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -433,8 +440,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -445,8 +452,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -457,8 +464,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -469,8 +476,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -481,8 +488,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -493,8 +500,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -508,13 +515,13 @@
 
   <Group>
     <GroupName>Drivers</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -525,8 +532,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -537,8 +544,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -557,8 +564,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -569,8 +576,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -581,8 +588,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -593,8 +600,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -605,8 +612,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -625,56 +632,56 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\components\finsh\cmd.c</PathWithFileName>
-      <FilenameWithoutPath>cmd.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\components\finsh\msh_file.c</PathWithFileName>
+      <FilenameWithoutPath>msh_file.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\components\finsh\msh_parse.c</PathWithFileName>
-      <FilenameWithoutPath>msh_parse.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\components\finsh\shell.c</PathWithFileName>
+      <FilenameWithoutPath>shell.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\components\finsh\shell.c</PathWithFileName>
-      <FilenameWithoutPath>shell.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\components\finsh\cmd.c</PathWithFileName>
+      <FilenameWithoutPath>cmd.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\components\finsh\msh_file.c</PathWithFileName>
-      <FilenameWithoutPath>msh_file.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\components\finsh\msh_parse.c</PathWithFileName>
+      <FilenameWithoutPath>msh_parse.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -693,8 +700,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -705,8 +712,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -717,8 +724,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -729,8 +736,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -741,8 +748,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -753,8 +760,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -765,8 +772,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -777,8 +784,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -789,8 +796,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -801,8 +808,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -813,8 +820,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -825,8 +832,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -837,8 +844,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -849,8 +856,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -861,8 +868,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <GroupNumber>8</GroupNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -881,62 +888,62 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>8</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <GroupNumber>9</GroupNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\src\klibc\kstdio.c</PathWithFileName>
-      <FilenameWithoutPath>kstdio.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\src\klibc\kerrno.c</PathWithFileName>
+      <FilenameWithoutPath>kerrno.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>8</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <GroupNumber>9</GroupNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\src\klibc\rt_vsscanf.c</PathWithFileName>
-      <FilenameWithoutPath>rt_vsscanf.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\src\klibc\kstring.c</PathWithFileName>
+      <FilenameWithoutPath>kstring.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>8</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <GroupNumber>9</GroupNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\src\klibc\rt_vsnprintf_tiny.c</PathWithFileName>
-      <FilenameWithoutPath>rt_vsnprintf_tiny.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\src\klibc\kstdio.c</PathWithFileName>
+      <FilenameWithoutPath>kstdio.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>8</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <GroupNumber>9</GroupNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\src\klibc\kerrno.c</PathWithFileName>
-      <FilenameWithoutPath>kerrno.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\src\klibc\rt_vsnprintf_tiny.c</PathWithFileName>
+      <FilenameWithoutPath>rt_vsnprintf_tiny.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>8</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <GroupNumber>9</GroupNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\..\..\src\klibc\kstring.c</PathWithFileName>
-      <FilenameWithoutPath>kstring.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\src\klibc\rt_vsscanf.c</PathWithFileName>
+      <FilenameWithoutPath>rt_vsscanf.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -949,8 +956,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -961,8 +968,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -973,8 +980,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -985,8 +992,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>63</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -997,8 +1004,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1009,8 +1016,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <GroupNumber>10</GroupNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1029,8 +1036,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>66</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1041,8 +1048,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1053,8 +1060,20 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>68</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>packages\gd32-arm-series-latest\GD32H7xx\GD32H7xx_standard_peripheral\Source\gd32h7xx_dma.c</PathWithFileName>
+      <FilenameWithoutPath>gd32h7xx_dma.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1065,8 +1084,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1077,8 +1096,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>71</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1089,8 +1108,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>72</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1101,8 +1120,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>73</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1113,8 +1132,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>74</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,8 +1144,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>72</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>75</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,8 +1156,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>10</GroupNumber>
-      <FileNumber>73</FileNumber>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>76</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 92 - 21
bsp/gd32/arm/gd32h759i-eval/project.uvprojx

@@ -138,7 +138,7 @@
           </Flash1>
           <bUseTDR>1</bUseTDR>
           <Flash2>BIN\UL2CM3.DLL</Flash2>
-          <Flash3>"" ()</Flash3>
+          <Flash3></Flash3>
           <Flash4></Flash4>
           <pFcarmOut></pFcarmOut>
           <pFcarmGrp></pFcarmGrp>
@@ -338,9 +338,9 @@
             <v6Rtti>0</v6Rtti>
             <VariousControls>
               <MiscControls></MiscControls>
-              <Define>GD32H7XX, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_LIBC, __STDC_LIMIT_MACROS, __RTTHREAD__</Define>
+              <Define>GD32H7XX, RT_USING_ARMLIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_LIBC, USE_STDPERIPH_DRIVER</Define>
               <Undefine></Undefine>
-              <IncludePath>packages\gd32-arm-cmsis-latest\GD32H7xx\GD\GD32H7xx\Include;..\..\..\..\libcpu\arm\cortex-m7;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-cmsis-latest\GD32H7xx;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\phy;..\..\..\..\include;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;board;..\libraries\gd32_drivers;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;applications;..\..\..\..\components\libc\posix\io\poll;packages\gd32-arm-series-latest\GD32H7xx\GD32H7xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\drivers\include</IncludePath>
+              <IncludePath>..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m7;packages\gd32-arm-cmsis-latest\GD32H7xx;packages\gd32-arm-cmsis-latest\GD32H7xx\GD\GD32H7xx\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\finsh;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\common;..\..\..\..\components\libc\posix\ipc;applications;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\include;packages\at24cxx-latest;..\libraries\gd32_drivers;.;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;board;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;..\..\..\..\include;packages\gd32-arm-series-latest\GD32H7xx\GD32H7xx_standard_peripheral\Include</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -391,6 +391,16 @@
             </File>
           </Files>
         </Group>
+        <Group>
+          <GroupName>at24cxx</GroupName>
+          <Files>
+            <File>
+              <FileName>at24cxx.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>packages\at24cxx-latest\at24cxx.c</FilePath>
+            </File>
+          </Files>
+        </Group>
         <Group>
           <GroupName>Compiler</GroupName>
           <Files>
@@ -663,6 +673,62 @@
                 </FileArmAds>
               </FileOption>
             </File>
+            <File>
+              <FileName>dev_soft_i2c.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\components\drivers\i2c\dev_soft_i2c.c</FilePath>
+              <FileOption>
+                <CommonProperty>
+                  <UseCPPCompiler>2</UseCPPCompiler>
+                  <RVCTCodeConst>0</RVCTCodeConst>
+                  <RVCTZI>0</RVCTZI>
+                  <RVCTOtherData>0</RVCTOtherData>
+                  <ModuleSelection>0</ModuleSelection>
+                  <IncludeInBuild>1</IncludeInBuild>
+                  <AlwaysBuild>0</AlwaysBuild>
+                  <GenerateAssemblyFile>0</GenerateAssemblyFile>
+                  <AssembleAssemblyFile>0</AssembleAssemblyFile>
+                  <PublicsOnly>0</PublicsOnly>
+                  <StopOnExitCode>3</StopOnExitCode>
+                  <CustomArgument></CustomArgument>
+                  <IncludeLibraryModules></IncludeLibraryModules>
+                  <ComprImg>1</ComprImg>
+                </CommonProperty>
+                <FileArmAds>
+                  <Cads>
+                    <interw>2</interw>
+                    <Optim>0</Optim>
+                    <oTime>2</oTime>
+                    <SplitLS>2</SplitLS>
+                    <OneElfS>2</OneElfS>
+                    <Strict>2</Strict>
+                    <EnumInt>2</EnumInt>
+                    <PlainCh>2</PlainCh>
+                    <Ropi>2</Ropi>
+                    <Rwpi>2</Rwpi>
+                    <wLevel>0</wLevel>
+                    <uThumb>2</uThumb>
+                    <uSurpInc>2</uSurpInc>
+                    <uC99>2</uC99>
+                    <uGnu>2</uGnu>
+                    <useXO>2</useXO>
+                    <v6Lang>0</v6Lang>
+                    <v6LangP>0</v6LangP>
+                    <vShortEn>2</vShortEn>
+                    <vShortWch>2</vShortWch>
+                    <v6Lto>2</v6Lto>
+                    <v6WtE>2</v6WtE>
+                    <v6Rtti>2</v6Rtti>
+                    <VariousControls>
+                      <MiscControls> </MiscControls>
+                      <Define>__RT_IPC_SOURCE__</Define>
+                      <Undefine> </Undefine>
+                      <IncludePath></IncludePath>
+                    </VariousControls>
+                  </Cads>
+                </FileArmAds>
+              </FileOption>
+            </File>
             <File>
               <FileName>completion_comm.c</FileName>
               <FileType>1</FileType>
@@ -1590,24 +1656,24 @@
           <GroupName>Finsh</GroupName>
           <Files>
             <File>
-              <FileName>cmd.c</FileName>
+              <FileName>msh_file.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>..\..\..\..\components\finsh\msh_file.c</FilePath>
             </File>
             <File>
-              <FileName>msh_parse.c</FileName>
+              <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\components\finsh\msh_parse.c</FilePath>
+              <FilePath>..\..\..\..\components\finsh\shell.c</FilePath>
             </File>
             <File>
-              <FileName>shell.c</FileName>
+              <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\components\finsh\shell.c</FilePath>
+              <FilePath>..\..\..\..\components\finsh\cmd.c</FilePath>
             </File>
             <File>
-              <FileName>msh_file.c</FileName>
+              <FileName>msh_parse.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\components\finsh\msh_file.c</FilePath>
+              <FilePath>..\..\..\..\components\finsh\msh_parse.c</FilePath>
             </File>
             <File>
               <FileName>msh.c</FileName>
@@ -2465,29 +2531,29 @@
           <GroupName>klibc</GroupName>
           <Files>
             <File>
-              <FileName>kstdio.c</FileName>
+              <FileName>kerrno.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\src\klibc\kstdio.c</FilePath>
+              <FilePath>..\..\..\..\src\klibc\kerrno.c</FilePath>
             </File>
             <File>
-              <FileName>rt_vsscanf.c</FileName>
+              <FileName>kstring.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\src\klibc\rt_vsscanf.c</FilePath>
+              <FilePath>..\..\..\..\src\klibc\kstring.c</FilePath>
             </File>
             <File>
-              <FileName>rt_vsnprintf_tiny.c</FileName>
+              <FileName>kstdio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\src\klibc\rt_vsnprintf_tiny.c</FilePath>
+              <FilePath>..\..\..\..\src\klibc\kstdio.c</FilePath>
             </File>
             <File>
-              <FileName>kerrno.c</FileName>
+              <FileName>rt_vsnprintf_tiny.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\src\klibc\kerrno.c</FilePath>
+              <FilePath>..\..\..\..\src\klibc\rt_vsnprintf_tiny.c</FilePath>
             </File>
             <File>
-              <FileName>kstring.c</FileName>
+              <FileName>rt_vsscanf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\..\..\src\klibc\kstring.c</FilePath>
+              <FilePath>..\..\..\..\src\klibc\rt_vsscanf.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -2539,6 +2605,11 @@
               <FileType>1</FileType>
               <FilePath>packages\gd32-arm-cmsis-latest\GD32H7xx\GD\GD32H7xx\Source\system_gd32h7xx.c</FilePath>
             </File>
+            <File>
+              <FileName>gd32h7xx_dma.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>packages\gd32-arm-series-latest\GD32H7xx\GD32H7xx_standard_peripheral\Source\gd32h7xx_dma.c</FilePath>
+            </File>
             <File>
               <FileName>gd32h7xx_exti.c</FileName>
               <FileType>1</FileType>

+ 1 - 1
bsp/gd32/arm/gd32h759i-eval/rtconfig.h

@@ -61,7 +61,7 @@
 
 /* end of rt_strnlen options */
 /* end of klibc options */
-#define RT_NAME_MAX 8
+#define RT_NAME_MAX 16
 #define RT_CPUS_NR 1
 #define RT_ALIGN_SIZE 8
 #define RT_THREAD_PRIORITY_32

+ 2 - 2
bsp/gd32/arm/libraries/gd32_drivers/SConscript

@@ -26,8 +26,8 @@ if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
  
  # add i2c hard drivers.       
 if GetDepend(['RT_USING_I2C']):
-    if GetDepend('BSP_USING_HW_I2C0') or GetDepend('BSP_USING_HW_I2C1'):
-        src += ['drv_hw_i2c.c']
+    if GetDepend('BSP_USING_HARD_I2C0') or GetDepend('BSP_USING_HARD_I2C1') or GetDepend('BSP_USING_HARD_I2C2') or GetDepend('BSP_USING_HARD_I2C3') or GetDepend('BSP_USING_HARD_I2C4') or GetDepend('BSP_USING_HARD_I2C5'):
+        src += ['drv_hard_i2c.c']
 
 # add spi drivers.
 if GetDepend('RT_USING_SPI'):

+ 562 - 0
bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c

@@ -0,0 +1,562 @@
+/*
+ * Copyright (c) 2006-2025, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author            Notes
+ * 2021-12-20     BruceOu           the first version
+ */
+
+#include "drv_hard_i2c.h"
+
+#ifdef RT_USING_I2C
+
+#define LOG_TAG              "drv.i2c"
+#include <rtdbg.h>
+
+#if !defined(BSP_USING_HARD_I2C0) && !defined(BSP_USING_HARD_I2C1) && !defined(BSP_USING_HARD_I2C2) && !defined(BSP_USING_HARD_I2C3)  && !defined(BSP_USING_HARD_I2C4)  && !defined(BSP_USING_HARD_I2C5)
+#error "Please define at least one BSP_USING_I2Cx"
+/* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */
+#endif
+
+#if defined(BSP_USING_HARD_I2C0)
+struct rt_i2c_bus_device i2c0;
+#endif /* BSP_USING_I2C0 */
+
+#if defined(BSP_USING_HARD_I2C1)
+struct rt_i2c_bus_device i2c1;
+#endif /* BSP_USING_I2C1 */
+
+#if defined(BSP_USING_HARD_I2C2)
+struct rt_i2c_bus_device i2c2;
+#endif /* BSP_USING_I2C2 */
+
+#if defined(BSP_USING_HARD_I2C3)
+struct rt_i2c_bus_device i2c3;
+#endif /* BSP_USING_I2C3 */
+
+#if defined(BSP_USING_HARD_I2C4)
+struct rt_i2c_bus_device i2c4;
+#endif /* BSP_USING_I2C4 */
+
+#if defined(BSP_USING_HARD_I2C5)
+struct rt_i2c_bus_device i2c5;
+#endif /* BSP_USING_I2C5 */
+
+#if defined (SOC_SERIES_GD32F5xx)
+#define i2c_flag_get_gd                      i2c_add_flag_get
+#define I2C_FLAG_RBNE_GD                     I2C_ADD_FLAG_RBNE
+#define i2c_data_receive_gd                  i2c_add_data_receive
+#define I2C_STAT_GD                          I2C_ADD_STAT
+#define I2C_STAT_TBE_GD                      I2C_ADD_STAT_TBE
+#define i2c_data_transmit_gd                 i2c_add_data_transmit
+#define I2C_STAT_TI_GD                       I2C_ADD_STAT_TI
+#define i2c_address10_enable_gd              i2c_add_address10_enable
+#define i2c_address10_disable_gd             i2c_add_address10_disable
+#define i2c_master_addressing_gd             i2c_add_master_addressing
+#define I2C_MASTER_RECEIVE_GD                I2C_ADD_MASTER_RECEIVE
+#define i2c_transfer_byte_number_config_gd   i2c_add_transfer_byte_number_config
+#define i2c_start_on_bus_gd                  i2c_add_start_on_bus
+#define I2C_MASTER_TRANSMIT_GD               I2C_ADD_MASTER_TRANSMIT
+#define I2C_FLAG_I2CBSY_GD                   I2C_ADD_FLAG_I2CBSY
+#define I2C_FLAG_TC_GD                       I2C_ADD_FLAG_TC
+#define I2C_FLAG_TI_GD                       I2C_ADD_FLAG_TI
+#define i2c_stop_on_bus_gd                   i2c_add_stop_on_bus
+#define I2C_FLAG_STPDET_GD                   I2C_ADD_FLAG_STPDET
+#define i2c_timing_config_gd                 i2c_add_timing_config
+#define i2c_master_clock_config_gd           i2c_add_master_clock_config
+#define i2c_enable_gd                        i2c_add_enable
+#define i2c_flag_clear_gd                    i2c_add_flag_clear
+
+#else
+
+#define i2c_flag_get_gd                      i2c_flag_get
+#define I2C_FLAG_RBNE_GD                     I2C_FLAG_RBNE
+#define i2c_data_receive_gd                  i2c_data_receive
+#define I2C_STAT_GD                          I2C_STAT
+#define I2C_STAT_TBE_GD                      I2C_STAT_TBE
+#define i2c_data_transmit_gd                 i2c_data_transmit
+#define I2C_STAT_TI_GD                       I2C_STAT_TI
+#define i2c_address10_enable_gd              i2c_address10_enable
+#define i2c_address10_disable_gd             i2c_address10_disable
+#define i2c_master_addressing_gd             i2c_master_addressing
+#define I2C_MASTER_RECEIVE_GD                I2C_MASTER_RECEIVE
+#define i2c_transfer_byte_number_config_gd   i2c_transfer_byte_number_config
+#define i2c_start_on_bus_gd                  i2c_start_on_bus
+#define I2C_MASTER_TRANSMIT_GD               I2C_MASTER_TRANSMIT
+#define I2C_FLAG_I2CBSY_GD                   I2C_FLAG_I2CBSY
+#define I2C_FLAG_TC_GD                       I2C_FLAG_TC
+#define I2C_FLAG_TI_GD                       I2C_FLAG_TI
+#define i2c_stop_on_bus_gd                   i2c_stop_on_bus
+#define I2C_FLAG_STPDET_GD                   I2C_FLAG_STPDET
+#define i2c_timing_config_gd                 i2c_timing_config
+#define i2c_master_clock_config_gd           i2c_master_clock_config
+#define i2c_enable_gd                        i2c_enable
+#define i2c_flag_clear_gd                    i2c_flag_clear
+
+#endif
+
+#if defined (SOC_SERIES_GD32F5xx)
+#define IS_I2C_LEGACY(periph)  ((periph) == I2C0 || (periph) == I2C1 || (periph) == I2C2)
+#elif defined (SOC_SERIES_GD32F4xx)
+#define IS_I2C_LEGACY(periph)  (1)
+#elif defined (SOC_SERIES_GD32H7xx)
+#define IS_I2C_LEGACY(periph)  (0)
+#endif
+
+static const struct gd32_i2c_bus gd_i2c_config[] = {
+#ifdef BSP_USING_HARD_I2C0
+    {
+    I2C0,    /* uart peripheral index */
+
+    RCU_I2C0, RCU_GPIOB, RCU_GPIOB,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOB, GPIO_AF_4, GPIO_PIN_6,    /* scl port, scl alternate, scl pin */
+    GPIOB, GPIO_AF_4, GPIO_PIN_7,    /* sda port, sda alternate, sda pin */
+
+        &i2c0,
+        "hwi2c0",
+    },
+#endif
+
+#ifdef BSP_USING_HARD_I2C1
+    {
+    I2C1,    /* uart peripheral index */
+
+    RCU_I2C1, RCU_GPIOH, RCU_GPIOB,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOH, GPIO_AF_4, GPIO_PIN_4,    /* scl port, scl alternate, scl pin */
+    GPIOB, GPIO_AF_4, GPIO_PIN_11,    /* sda port, sda alternate, sda pin */
+
+        &i2c1,
+        "hwi2c1",
+    },
+#endif
+
+#ifdef BSP_USING_HARD_I2C2
+    {
+    I2C2,    /* uart peripheral index */
+
+    RCU_I2C2, RCU_GPIOA, RCU_GPIOC,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOA, GPIO_AF_4, GPIO_PIN_8,    /* scl port, scl alternate, scl pin */
+    GPIOC, GPIO_AF_4, GPIO_PIN_9,    /* sda port, sda alternate, sda pin */
+
+        &i2c2,
+        "hwi2c2",
+    },
+#endif
+
+#ifdef BSP_USING_HARD_I2C3
+    {
+    I2C3,    /* uart peripheral index */
+
+    RCU_I2C3, RCU_GPIOF, RCU_GPIOF,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOF, GPIO_AF_4, GPIO_PIN_14,    /* scl port, scl alternate, scl pin */
+    GPIOF, GPIO_AF_4, GPIO_PIN_15,    /* sda port, sda alternate, sda pin */
+
+        &i2c3,
+        "hwi2c3",
+    },
+#endif
+#ifdef BSP_USING_HARD_I2C4
+    {
+    I2C4,    /* uart peripheral index */
+
+    RCU_I2C4, RCU_GPIOG, RCU_GPIOG,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOG, GPIO_AF_6, GPIO_PIN_7,    /* scl port, scl alternate, scl pin */
+    GPIOG, GPIO_AF_6, GPIO_PIN_8,    /* sda port, sda alternate, sda pin */
+
+        &i2c4,
+        "hwi2c4",
+    },
+#endif
+#ifdef BSP_USING_HARD_I2C5
+    {
+    I2C5,    /* uart peripheral index */
+
+    RCU_I2C5, RCU_GPIOF, RCU_GPIOF,    /* periph clock, scl gpio clock, sda gpio clock */
+
+    GPIOF, GPIO_AF_4, GPIO_PIN_11,    /* scl port, scl alternate, scl pin */
+    GPIOF, GPIO_AF_4, GPIO_PIN_12,    /* sda port, sda alternate, sda pin */
+
+        &i2c5,
+        "hwi2c5",
+    }
+#endif
+};
+
+/**
+  * @brief  This function initializes the i2c pin.
+  * @param  i2c
+  * @retval None
+  */
+static void gd32_i2c_gpio_init(const struct gd32_i2c_bus *i2c)
+{
+    /* enable I2C and GPIO clock */
+    rcu_periph_clock_enable(i2c->scl_gpio_clk);
+    rcu_periph_clock_enable(i2c->sda_gpio_clk);
+    rcu_periph_clock_enable(i2c->per_clk);
+
+    /* configure I2C_SCL as alternate function push-pull */
+    gpio_af_set(i2c->scl_port, i2c->scl_af, i2c->scl_pin);
+    gpio_mode_set(i2c->scl_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, i2c->scl_pin);
+#if defined (SOC_SERIES_GD32H7xx)
+    gpio_output_options_set(i2c->scl_port, GPIO_OTYPE_OD, GPIO_OSPEED_60MHZ, i2c->scl_pin);
+    /* configure I2C_SDA as alternate function push-pull */
+    gpio_af_set(i2c->sda_port, i2c->sda_af, i2c->sda_pin);
+    gpio_mode_set(i2c->sda_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, i2c->sda_pin);
+    gpio_output_options_set(i2c->sda_port, GPIO_OTYPE_OD, GPIO_OSPEED_60MHZ, i2c->sda_pin);
+#else
+    gpio_output_options_set(i2c->scl_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2c->scl_pin);
+    /* configure I2C_SDA as alternate function push-pull */
+    gpio_af_set(i2c->sda_port, i2c->sda_af, i2c->sda_pin);
+    gpio_mode_set(i2c->sda_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, i2c->sda_pin);
+    gpio_output_options_set(i2c->sda_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, i2c->sda_pin);
+#endif
+}
+
+/**
+  * @brief  read data.
+  * @param  i2c_periph
+  * @param  *p_buffer
+  * @param  data_byte
+  * @retval None
+  */
+static uint8_t gd32_i2c_read(rt_uint32_t i2c_periph, rt_uint8_t *p_buffer, rt_uint16_t data_byte)
+{
+    if (data_byte == 0) return 1;
+    /* while there is data to be read */
+
+    while(data_byte)
+    {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx)
+        if(IS_I2C_LEGACY(i2c_periph))
+        {
+            if(3 == data_byte)
+            {
+                    /* wait until BTC bit is set */
+                    while(!i2c_flag_get(i2c_periph, I2C_FLAG_BTC));
+                    /* disable acknowledge */
+                    i2c_ack_config(i2c_periph, I2C_ACK_DISABLE);
+            }
+
+            if(2 == data_byte)
+            {
+                    /* wait until BTC bit is set */
+                    while(!i2c_flag_get(i2c_periph, I2C_FLAG_BTC));
+                    /* send a stop condition to I2C bus */
+                    i2c_stop_on_bus(i2c_periph);
+            }
+            /* wait until RBNE bit is set */
+            if(i2c_flag_get(i2c_periph, I2C_FLAG_RBNE))
+            {
+                    /* read a byte from the EEPROM */
+                    *p_buffer = i2c_data_receive(i2c_periph);
+                    /* point to the next location where the byte read will be saved */
+                    p_buffer++;
+                    /* decrement the read bytes counter */
+                    data_byte--;
+            }
+        }else
+#endif
+        {
+            /* wait until the RBNE bit is set */
+            while(!i2c_flag_get_gd(i2c_periph, I2C_FLAG_RBNE_GD));
+
+            /* read a byte */
+            *p_buffer = i2c_data_receive_gd(i2c_periph);
+            /* point to the next location where the byte read will be saved */
+            p_buffer++;
+            /* decrement the read bytes counter */
+            data_byte--;
+        }
+    }
+    return 0;
+}
+
+/**
+  * @brief  write data.
+  * @param  i2c_periph
+  * @param  *p_buffer
+  * @param  data_byte
+  * @retval None
+  */
+static uint8_t gd32_i2c_write(rt_uint32_t i2c_periph, uint8_t *p_buffer, uint16_t data_byte)
+{
+    if (data_byte == 0) return 1;
+
+    while(data_byte)
+    {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx)
+        if(IS_I2C_LEGACY(i2c_periph))
+        {
+            /* data transmission */
+            i2c_data_transmit(i2c_periph, *p_buffer);
+            /* point to the next byte to be written */
+            p_buffer++;
+            /* decrement the write bytes counter */
+            data_byte--;
+            /* wait until the TI bit is set */
+            while(!i2c_flag_get(i2c_periph, I2C_FLAG_BTC));
+        }
+        else
+#endif
+        {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32H7xx)
+            /* wait until the transmit data buffer is empty */
+            I2C_STAT_GD(i2c_periph) |= I2C_STAT_TBE_GD;
+            while(!i2c_flag_get(i2c_periph, I2C_FLAG_TBE));
+
+            while(data_byte)
+            {
+                /* wait until the TI bit is set */
+                while(!i2c_flag_get(i2c_periph, I2C_FLAG_TI_GD));
+                /* data transmission */
+                i2c_data_transmit(i2c_periph, *p_buffer);
+                /* point to the next byte to be written */
+                p_buffer++;
+                /* decrement the write bytes counter */
+                data_byte--;
+            }
+#endif
+        }
+    }
+
+    if(data_byte != 0)
+    {
+        return 1;
+    }
+    return 0;
+}
+
+/**
+  * @brief
+  * @param
+  * @param
+  * @param
+  * @retval
+  */
+
+static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
+{
+    static struct rt_i2c_msg *msg;
+
+    rt_uint32_t i,w_total_byte=0,r_total_byte=0;
+    rt_err_t ret = RT_ERROR;
+
+    RT_ASSERT(bus != RT_NULL);
+
+    struct gd32_i2c_bus *gd32_i2c = (struct gd32_i2c_bus *)bus->priv;
+
+    for(i = 0; i < num; i++)
+    {
+        msg = &msgs[i];
+
+        if(msg->flags & RT_I2C_RD)
+        {
+            r_total_byte += msg->len;
+        }else{
+            w_total_byte += msg->len;
+        }
+    }
+
+    for(i = 0; i < num; i++)
+    {
+        msg = &msgs[i];
+        if (!(msg->flags & RT_I2C_NO_START))
+        {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx)
+            if(IS_I2C_LEGACY(gd32_i2c->i2c_periph))
+            {
+
+                if(msg->flags & RT_I2C_RD)
+                {
+                    if(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY))
+                    {
+                            i2c_stop_on_bus(gd32_i2c->i2c_periph);
+                    }
+                        /* enable acknowledge */
+                    i2c_ack_config(gd32_i2c->i2c_periph, I2C_ACK_ENABLE);
+                        /* i2c master sends start signal only when the bus is idle */
+                    while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY));
+                        /* send the start signal */
+                    i2c_start_on_bus(gd32_i2c->i2c_periph);
+                     /* i2c master sends START signal successfully */
+                    while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND));
+
+                    i2c_master_addressing(gd32_i2c->i2c_periph, msg->addr, I2C_RECEIVER);
+
+                    while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND));
+                       /* address flag set means i2c slave sends ACK */
+                    i2c_flag_clear(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND);
+
+               }else {
+                     /* configure slave address */
+                    while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY));
+                     //i2c_transfer_byte_number_config(gd32_i2c->i2c_periph, w_total_byte);
+                     /* send a start condition to I2C bus */
+                    i2c_start_on_bus(gd32_i2c->i2c_periph);
+                    while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND));
+
+                    i2c_master_addressing(gd32_i2c->i2c_periph, msg->addr, I2C_TRANSMITTER);
+                    while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND));
+
+                    i2c_flag_clear(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND);
+               }
+            }else
+#endif
+            {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32H7xx)
+                if(msg->flags & RT_I2C_ADDR_10BIT)
+                {
+                        /* enable 10-bit addressing mode in master mode */
+                    i2c_address10_enable_gd(gd32_i2c->i2c_periph);
+                }else {
+                        /* disable 10-bit addressing mode in master mode */
+                    i2c_address10_disable_gd(gd32_i2c->i2c_periph);
+                }
+
+                if(msg->flags & RT_I2C_RD)
+                {
+                     /* configure slave address */
+                    i2c_master_addressing_gd(gd32_i2c->i2c_periph, msg->addr, I2C_MASTER_RECEIVE_GD);
+
+                    i2c_transfer_byte_number_config_gd(gd32_i2c->i2c_periph, r_total_byte);
+                     /* send a start condition to I2C bus */
+                    i2c_start_on_bus_gd(gd32_i2c->i2c_periph);
+
+                }else {
+                     /* configure slave address */
+                    i2c_master_addressing_gd(gd32_i2c->i2c_periph, msg->addr, I2C_MASTER_TRANSMIT_GD);
+                    while(i2c_flag_get_gd(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY_GD));
+                    i2c_transfer_byte_number_config_gd(gd32_i2c->i2c_periph, w_total_byte);
+                     /* send a start condition to I2C bus */
+                    i2c_start_on_bus_gd(gd32_i2c->i2c_periph);
+                }
+#endif
+            }
+        }
+
+        if(msg->flags & RT_I2C_RD)
+        {
+            if(gd32_i2c_read(gd32_i2c->i2c_periph, msg->buf, msg->len) != 0)
+            {
+                LOG_E("i2c bus read failed,i2c bus stop!");
+                goto out;
+            }
+        }else {
+            if(gd32_i2c_write(gd32_i2c->i2c_periph, msg->buf, msg->len) != 0)
+            {
+                LOG_E("i2c bus write failed,i2c bus stop!");
+                goto out;
+            }
+       }
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32H7xx)
+        if(!IS_I2C_LEGACY(gd32_i2c->i2c_periph))
+        {
+            if(r_total_byte != 0)
+            {
+                while(!i2c_flag_get_gd(gd32_i2c->i2c_periph, I2C_FLAG_TC_GD));
+            }
+        }
+#endif
+
+    }
+    ret = i;
+
+out:
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx)
+    if(IS_I2C_LEGACY(gd32_i2c->i2c_periph))
+    {
+
+        if(!(msg->flags & RT_I2C_NO_STOP))
+        {
+            if(msg->flags & RT_I2C_RD)
+            {
+                while((I2C_CTL0(gd32_i2c->i2c_periph) & I2C_CTL0_STOP));
+            }else{
+                /* send a stop condition to I2C bus */
+                i2c_stop_on_bus(gd32_i2c->i2c_periph);
+                /* wait until stop condition generate */
+                while((I2C_CTL0(gd32_i2c->i2c_periph) & I2C_CTL0_STOP));
+                /* clear the STPDET bit */
+            }
+        }
+    }else
+#endif
+    {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32H7xx)
+        if(!(msg->flags & RT_I2C_NO_STOP))
+        {
+            while(!i2c_flag_get_gd(gd32_i2c->i2c_periph, I2C_FLAG_TC_GD));
+            /* send a stop condition to I2C bus */
+            i2c_stop_on_bus_gd(gd32_i2c->i2c_periph);
+            /* wait until stop condition generate */
+            while(!i2c_flag_get_gd(gd32_i2c->i2c_periph, I2C_FLAG_STPDET_GD));
+            /* clear the STPDET bit */
+            i2c_flag_clear_gd(gd32_i2c->i2c_periph, I2C_FLAG_STPDET_GD);
+        }
+#endif
+    }
+    return ret;
+}
+
+static const struct rt_i2c_bus_device_ops i2c_ops = {
+    .master_xfer = gd32_i2c_master_xfer,
+    .slave_xfer = RT_NULL,
+    .i2c_bus_control = RT_NULL
+};
+
+/**
+  * @brief  I2C initialization function
+  * @param  None
+  * @retval RT_EOK indicates successful initialization.
+  */
+int rt_hw_i2c_init(void)
+{
+    rt_size_t obj_num = sizeof(gd_i2c_config) / sizeof(gd_i2c_config[0]);
+//    rt_err_t result;
+
+    for(int i = 0; i < obj_num; i++)
+    {
+
+        gd32_i2c_gpio_init(&gd_i2c_config[i]);
+
+        /* configure I2C timing. I2C speed clock=400kHz*/
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx)
+        if(IS_I2C_LEGACY(gd_i2c_config[i].i2c_periph))
+        {
+
+            i2c_clock_config(gd_i2c_config[i].i2c_periph, 100000, I2C_DTCY_2);
+            i2c_mode_addr_config(gd_i2c_config[i].i2c_periph, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0xa0);
+            i2c_enable(gd_i2c_config[i].i2c_periph);
+            i2c_ack_config(gd_i2c_config[i].i2c_periph, I2C_ACK_ENABLE);
+        }else
+#endif
+        {
+#if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32H7xx)
+            i2c_timing_config_gd(gd_i2c_config[i].i2c_periph, 0x1, 0x7, 0);
+            i2c_master_clock_config_gd(gd_i2c_config[i].i2c_periph, 0x2D, 0x87);
+
+            /* enable I2C1 */
+            i2c_enable_gd(gd_i2c_config[i].i2c_periph);
+#endif
+        }
+
+        gd_i2c_config[i].i2c_bus->ops = &i2c_ops;
+        gd_i2c_config[i].i2c_bus->priv = (void *)&gd_i2c_config[i];
+
+        rt_i2c_bus_device_register(gd_i2c_config[i].i2c_bus, gd_i2c_config[i].device_name);
+    }
+
+    return RT_EOK;
+}
+
+INIT_BOARD_EXPORT(rt_hw_i2c_init);
+
+#endif /* RT_USING_I2C */
+

+ 49 - 0
bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006-2025, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2021-12-20     BruceOu      the first version
+ */
+
+#ifndef __DRV_I2C__
+#define __DRV_I2C__
+
+#include <rtthread.h>
+#include <rthw.h>
+#include <rtdevice.h>
+#include <board.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GD32 i2c driver */
+struct gd32_i2c_bus
+{
+    uint32_t i2c_periph;             /* Todo: 3bits */
+
+    rcu_periph_enum per_clk;         /* Todo: 5bits */
+    rcu_periph_enum scl_gpio_clk;    /* Todo: 5bits */
+    rcu_periph_enum sda_gpio_clk;    /* Todo: 5bits */
+
+    uint32_t scl_port;               /* Todo: 4bits */
+    uint16_t scl_af;                 /* Todo: 4bits */
+    uint16_t scl_pin;                /* Todo: 4bits */
+
+    uint32_t sda_port;               /* Todo: 4bits */
+    uint16_t sda_af;                 /* Todo: 4bits */
+    uint16_t sda_pin;                /* Todo: 4bits */
+
+    struct rt_i2c_bus_device *i2c_bus;
+    char *device_name;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DRV_I2C__ */
+

+ 0 - 600
bsp/gd32/arm/libraries/gd32_drivers/drv_hw_i2c.c

@@ -1,600 +0,0 @@
-/*
- * Copyright (c) 2006-2025, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- */
-
-#include "drv_hw_i2c.h"
-
-
-#ifdef RT_USING_I2C
-
-#define LOG_TAG              "drv.i2c"
-#include <rtdbg.h>
-
-static const struct gd32_i2c_config i2c_configs[] =
-{
-#ifdef BSP_USING_HW_I2C0
-     {
-        .i2c_periph = I2C0, .device_name = "i2c0", .periph_clk = RCU_I2C0, .i2c_clock_hz = BSP_HW_I2C0_CLOCK_SPEED,
-        .scl_clk = RCU_GPIOB, .scl_port = GPIOB, .scl_pin = GPIO_PIN_6, .scl_af = GPIO_AF_1,
-        .sda_clk = RCU_GPIOB, .sda_port = GPIOB, .sda_pin = GPIO_PIN_7, .sda_af = GPIO_AF_1,
-        .ev_irq_type = I2C0_EV_IRQn, .er_irq_type = I2C0_ER_IRQn,
-    },
-#endif
-#ifdef BSP_USING_HW_I2C1
-    {
-        .i2c_periph = I2C1, .device_name = "i2c1", .periph_clk = RCU_I2C1, .i2c_clock_hz = BSP_HW_I2C1_CLOCK_SPEED,
-        .scl_clk = RCU_GPIOB, .scl_port = GPIOB, .scl_pin = GPIO_PIN_10, .scl_af = GPIO_AF_1,
-        .sda_clk = RCU_GPIOB, .sda_port = GPIOB, .sda_pin = GPIO_PIN_11, .sda_af = GPIO_AF_1,
-        .ev_irq_type = I2C1_EV_IRQn, .er_irq_type = I2C1_ER_IRQn,
-    },
-#endif
-};
-
-static struct gd32_i2c i2c_objs[sizeof(i2c_configs) / sizeof(i2c_configs[0])];
-
-#define I2C_GD32_ERR_BERR (1U << 0)  /* Bus error */
-#define I2C_GD32_ERR_LARB (1U << 1)  /* Arbitration lost */
-#define I2C_GD32_ERR_AERR (1U << 2)  /* No ACK received */
-#define I2C_GD32_ERR_BUSY (1U << 4)  /* I2C bus busy */
-static inline void i2c_enable_interrupts(uint32_t i2c_periph)
-{
-    i2c_interrupt_enable(i2c_periph, I2C_INT_ERR);
-    i2c_interrupt_enable(i2c_periph, I2C_INT_EV);
-    i2c_interrupt_enable(i2c_periph, I2C_INT_BUF);
-}
-
-static inline void i2c_disable_interrupts(uint32_t i2c_periph)
-{
-    i2c_interrupt_disable(i2c_periph, I2C_INT_ERR);
-    i2c_interrupt_disable(i2c_periph, I2C_INT_EV);
-    i2c_interrupt_disable(i2c_periph, I2C_INT_BUF);
-}
-
-static inline void i2c_log_error(struct gd32_i2c *i2c_dev)
-{
-    if (i2c_dev->errs & I2C_GD32_ERR_BERR) LOG_E("[%s] Bus error", i2c_dev->config->device_name);
-    if (i2c_dev->errs & I2C_GD32_ERR_LARB) LOG_E("[%s] Arbitration lost", i2c_dev->config->device_name);
-    if (i2c_dev->errs & I2C_GD32_ERR_AERR) LOG_E("[%s] No ACK received", i2c_dev->config->device_name);
-    if (i2c_dev->errs & I2C_GD32_ERR_BUSY) LOG_E("[%s] I2C bus is busy", i2c_dev->config->device_name);
-}
-
-static inline void gd32_i2c_xfer_read(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-    rt_uint8_t read_byte;
-
-    i2c_obj->current->len--;
-    read_byte = I2C_DATA(cfg->i2c_periph);
-    *i2c_obj->current->buf = read_byte;
-
-    LOG_D("[%s] < Read byte: 0x%02X", cfg->device_name, read_byte);
-
-    i2c_obj->current->buf++;
-
-    if ((i2c_obj->xfer_len > 0U) && (i2c_obj->current->len == 0U))
-    {
-        i2c_obj->current++;
-    }
-}
-
-static inline void gd32_i2c_xfer_write(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-
-    rt_uint8_t write_byte = *i2c_obj->current->buf;
-    LOG_D("[%s] > Write byte: 0x%02X", cfg->device_name, write_byte);
-
-    i2c_obj->current->len--;
-    I2C_DATA(cfg->i2c_periph) = *i2c_obj->current->buf;
-    i2c_obj->current->buf++;
-
-    if ((i2c_obj->xfer_len > 0U) && (i2c_obj->current->len == 0U))
-    {
-        i2c_obj->current++;
-    }
-}
-
-static void gd32_i2c_handle_tbe(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-    LOG_D("[%s] TBE event: xfer_len=%d", cfg->device_name, i2c_obj->xfer_len);
-
-    if (i2c_obj->xfer_len > 0U)
-    {
-        i2c_obj->xfer_len--;
-        if (i2c_obj->xfer_len == 0U)
-        {
-            LOG_D("[%s] Last byte to send, disabling BUFIE, waiting for BTC.", cfg->device_name);
-            I2C_CTL1(cfg->i2c_periph) &= ~I2C_CTL1_BUFIE;
-        }
-        gd32_i2c_xfer_write(i2c_obj);
-    }
-    else
-    {
-        LOG_D("[%s] TBE indicates all data sent. Generating STOP.", cfg->device_name);
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_STOP;
-        rt_completion_done(&i2c_obj->sync_sem);
-    }
-}
-
-static void gd32_i2c_handle_rbne(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-    LOG_D("[%s] RBNE event: xfer_len=%d", cfg->device_name, i2c_obj->xfer_len);
-
-    switch (i2c_obj->xfer_len)
-    {
-    case 0:
-        LOG_W("[%s] Unexpected RBNE, waking thread.", cfg->device_name);
-        rt_completion_done(&i2c_obj->sync_sem);
-        break;
-    case 1:
-        i2c_obj->xfer_len--;
-        gd32_i2c_xfer_read(i2c_obj);
-        LOG_D("[%s] RBNE: Last byte received, waking thread.", cfg->device_name);
-        rt_completion_done(&i2c_obj->sync_sem);
-        break;
-    case 2:
-    case 3:
-        LOG_D("[%s] RBNE: %d bytes left, disabling BUFIE, waiting for BTC.", cfg->device_name, i2c_obj->xfer_len);
-        I2C_CTL1(cfg->i2c_periph) &= ~I2C_CTL1_BUFIE;
-        break;
-    default:
-        i2c_obj->xfer_len--;
-        gd32_i2c_xfer_read(i2c_obj);
-        break;
-    }
-}
-
-static void gd32_i2c_handle_btc(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-    LOG_D("[%s] BTC event: xfer_len=%d, flags=0x%X", cfg->device_name, i2c_obj->xfer_len, i2c_obj->current->flags);
-
-    if (i2c_obj->current->flags & RT_I2C_RD)
-    {
-        switch (i2c_obj->xfer_len)
-        {
-        case 2:
-            LOG_D("[%s] BTC: N=2, generating STOP.", cfg->device_name);
-            I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_STOP;
-            i2c_obj->xfer_len -= 2;
-            gd32_i2c_xfer_read(i2c_obj);
-            gd32_i2c_xfer_read(i2c_obj);
-            rt_completion_done(&i2c_obj->sync_sem);
-            break;
-        case 3:
-            LOG_D("[%s] BTC: N=3, clearing ACKEN for NACK.", cfg->device_name);
-            I2C_CTL0(cfg->i2c_periph) &= ~I2C_CTL0_ACKEN;
-            i2c_obj->xfer_len--;
-            gd32_i2c_xfer_read(i2c_obj);
-            break;
-        default:
-            LOG_W("[%s] Unexpected BTC in read mode, handling as RBNE.", cfg->device_name);
-            gd32_i2c_handle_rbne(i2c_obj);
-            break;
-        }
-    }
-    else
-    {
-        LOG_D("[%s] BTC in write mode, means last byte sent.", cfg->device_name);
-        gd32_i2c_handle_tbe(i2c_obj);
-    }
-}
-
-static void gd32_i2c_handle_addsend(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg = i2c_obj->config;
-    LOG_D("[%s] ADDSEND event: xfer_len=%d, flags=0x%X, is_restart=%d", cfg->device_name, i2c_obj->xfer_len, i2c_obj->current->flags, i2c_obj->is_restart);
-
-    if ((i2c_obj->current->flags & RT_I2C_RD) && (i2c_obj->xfer_len <= 1U))
-    {
-        LOG_D("[%s] ADDSEND: N<=1 read, clearing ACKEN.", cfg->device_name);
-        I2C_CTL0(cfg->i2c_periph) &= ~I2C_CTL0_ACKEN;
-    }
-
-    (void)I2C_STAT0(cfg->i2c_periph);
-    (void)I2C_STAT1(cfg->i2c_periph);
-
-    if (i2c_obj->is_restart)
-    {
-        i2c_obj->is_restart = RT_FALSE;
-        i2c_obj->current->flags |= RT_I2C_RD;
-        LOG_D("[%s] ADDSEND: 10-bit read restart. Generating RESTART.", cfg->device_name);
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_START;
-        return;
-    }
-
-    if ((i2c_obj->current->flags & RT_I2C_RD) && (i2c_obj->xfer_len == 1U))
-    {
-        LOG_D("[%s] ADDSEND: N=1 read, generating STOP.", cfg->device_name);
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_STOP;
-    }
-}
-
-static void gd32_i2c_event_handler(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg;
-    uint32_t stat0;
-
-    RT_ASSERT(i2c_obj != RT_NULL);
-    cfg = i2c_obj->config;
-
-    stat0 = I2C_STAT0(cfg->i2c_periph);
-    LOG_D("[%s] EV_IRQ: STAT0=0x%08X", cfg->device_name, stat0);
-
-    if (stat0 & I2C_STAT0_SBSEND)
-    {
-        uint8_t addr_byte;
-        if (i2c_obj->current->flags & RT_I2C_RD)
-        {
-            addr_byte = (i2c_obj->addr1 << 1) | 1;
-        }
-        else
-        {
-            addr_byte = (i2c_obj->addr1 << 1) | 0;
-        }
-        LOG_D("[%s] SBSEND: Sending address byte 0x%02X", cfg->device_name, addr_byte);
-        I2C_DATA(cfg->i2c_periph) = addr_byte;
-    }
-    else if (stat0 & I2C_STAT0_ADD10SEND)
-    {
-        LOG_D("[%s] ADD10SEND: Sending 2nd address byte 0x%02X", cfg->device_name, i2c_obj->addr2);
-        I2C_DATA(cfg->i2c_periph) = i2c_obj->addr2;
-    }
-    else if (stat0 & I2C_STAT0_ADDSEND)
-    {
-        gd32_i2c_handle_addsend(i2c_obj);
-    }
-    else if (stat0 & I2C_STAT0_BTC)
-    {
-        gd32_i2c_handle_btc(i2c_obj);
-    }
-    else if (stat0 & I2C_STAT0_RBNE)
-    {
-        gd32_i2c_handle_rbne(i2c_obj);
-    }
-    else if (stat0 & I2C_STAT0_TBE)
-    {
-        gd32_i2c_handle_tbe(i2c_obj);
-    }
-}
-
-void gd32_i2c_error_handler(struct gd32_i2c *i2c_obj)
-{
-    const struct gd32_i2c_config *cfg;
-    uint32_t stat0;
-
-    RT_ASSERT(i2c_obj != RT_NULL);
-    cfg = i2c_obj->config;
-
-    stat0 = I2C_STAT0(cfg->i2c_periph);
-    LOG_E("[%s] ER_IRQ: STAT0=0x%08X", cfg->device_name, stat0);
-
-    if (stat0 & I2C_STAT0_BERR)
-    {
-        I2C_STAT0(cfg->i2c_periph) &= ~I2C_STAT0_BERR;
-        i2c_obj->errs |= I2C_GD32_ERR_BERR;
-    }
-
-    if (stat0 & I2C_STAT0_LOSTARB)
-    {
-        I2C_STAT0(cfg->i2c_periph) &= ~I2C_STAT0_LOSTARB;
-        i2c_obj->errs |= I2C_GD32_ERR_LARB;
-    }
-
-    if (stat0 & I2C_STAT0_AERR)
-    {
-        I2C_STAT0(cfg->i2c_periph) &= ~I2C_STAT0_AERR;
-        i2c_obj->errs |= I2C_GD32_ERR_AERR;
-    }
-
-    if (i2c_obj->errs != 0)
-    {
-        LOG_D("[%s] Error detected, sending STOP and waking thread.", cfg->device_name);
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_STOP;
-        rt_completion_done(&i2c_obj->sync_sem);
-    }
-}
-
-static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
-{
-    struct gd32_i2c *i2c_dev;
-    const struct gd32_i2c_config *cfg;
-    rt_ssize_t i, itr;
-    rt_err_t result = RT_EOK;
-
-    RT_ASSERT(bus != RT_NULL);
-    RT_ASSERT(msgs != RT_NULL);
-    RT_ASSERT(num > 0);
-
-    i2c_dev = rt_container_of(bus, struct gd32_i2c, parent);
-    cfg = i2c_dev->config;
-
-    LOG_D("[%s] master_xfer: num_msgs=%d", cfg->device_name, num);
-
-    for (i = 0; i < num; i++)
-    {
-        if ((i < num - 1) && !(msgs[i].flags & RT_I2C_NO_STOP))
-        {
-            LOG_E("[%s] Only the last message can have a STOP signal", cfg->device_name);
-            return -RT_EINVAL;
-        }
-
-        if (msgs[i].len == 0 || msgs[i].buf == RT_NULL)
-        {
-            LOG_E("[%s] Invalid message buffer or length at index %d", cfg->device_name, i);
-            return -RT_EINVAL;
-        }
-    }
-
-    rt_mutex_take(&i2c_dev->bus_mutex, RT_WAITING_FOREVER);
-
-    I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_I2CEN;
-
-    for (i = 0; i < num; i = itr)
-    {
-        LOG_D("[%s] Processing msg segment starting at index %d", cfg->device_name, i);
-        i2c_dev->current = &msgs[i];
-        i2c_dev->xfer_len = msgs[i].len;
-        rt_uint16_t current_addr = i2c_dev->current->addr;
-
-        for (itr = i + 1; itr < num; itr++)
-        {
-            if ((msgs[itr].flags & RT_I2C_RD) != (i2c_dev->current->flags & RT_I2C_RD) ||
-                msgs[itr].addr != current_addr)
-            {
-                break;
-            }
-            i2c_dev->xfer_len += msgs[itr].len;
-        }
-        LOG_D("[%s] Merged %d msgs. Total len=%d, addr=0x%X, flags=0x%X",
-              cfg->device_name, itr - i, i2c_dev->xfer_len, current_addr, i2c_dev->current->flags);
-
-        LOG_D("[%s] Checking for bus busy...", cfg->device_name);
-        if (I2C_STAT1(cfg->i2c_periph) & I2C_STAT1_I2CBSY)
-        {
-            LOG_E("[%s] Bus is busy!", cfg->device_name);
-            i2c_dev->errs = I2C_GD32_ERR_BUSY;
-            result = -RT_EBUSY;
-            break;
-        }
-
-        if (i2c_dev->current->flags & RT_I2C_ADDR_10BIT)
-        {
-            i2c_dev->addr1 = 0xF0 | ((current_addr >> 8) & 0x03);
-            i2c_dev->addr2 = current_addr & 0xFF;
-            LOG_D("[%s] 10-bit address: 0x%X -> addr1=0x%X, addr2=0x%X", cfg->device_name, current_addr, i2c_dev->addr1, i2c_dev->addr2);
-        }
-        else
-        {
-            i2c_dev->addr1 = current_addr & 0x7F;
-        }
-
-        i2c_dev->errs = 0;
-        i2c_dev->is_restart = RT_FALSE;
-        rt_completion_init(&i2c_dev->sync_sem);
-
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_ACKEN;
-
-        if ((i2c_dev->current->flags & RT_I2C_RD) && (i2c_dev->current->flags & RT_I2C_ADDR_10BIT))
-        {
-            LOG_D("[%s] Preparing for 10-bit read restart.", cfg->device_name);
-            i2c_dev->is_restart = RT_TRUE;
-            i2c_dev->current->flags &= ~RT_I2C_RD;
-        }
-
-        if ((i2c_dev->current->flags & RT_I2C_RD) && (i2c_dev->xfer_len == 2))
-        {
-            LOG_D("[%s] N=2 read, setting POAP.", cfg->device_name);
-            I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_POAP;
-        }
-
-        LOG_D("[%s] Generating START, enabling IRQs, waiting for completion...", cfg->device_name);
-        i2c_enable_interrupts(cfg->i2c_periph);
-        I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_START;
-
-        result = rt_completion_wait(&i2c_dev->sync_sem, bus->timeout);
-
-        if (i2c_dev->is_restart == RT_TRUE)
-        {
-            i2c_dev->current->flags |= RT_I2C_RD;
-        }
-
-        I2C_CTL0(cfg->i2c_periph) &= ~I2C_CTL0_POAP;
-        i2c_disable_interrupts(cfg->i2c_periph);
-
-        if (result != RT_EOK)
-        {
-            LOG_E("[%s] I2C transaction timeout!", cfg->device_name);
-            result = -RT_ETIMEOUT;
-            I2C_CTL0(cfg->i2c_periph) |= I2C_CTL0_STOP;
-            break;
-        }
-
-        if (i2c_dev->errs != 0)
-        {
-            LOG_E("[%s] Hardware error detected by ISR.", cfg->device_name);
-            i2c_log_error(i2c_dev);
-            result = -RT_EIO;
-            break;
-        }
-        LOG_D("[%s] Transaction segment completed successfully.", cfg->device_name);
-    }
-
-    if (result == RT_EOK)
-    {
-        if (!(msgs[num - 1].flags & RT_I2C_NO_STOP))
-        {
-            LOG_D("[%s] Last message, Waiting STOP.", cfg->device_name);
-            rt_uint32_t timeout = 1000;
-            while (I2C_STAT1(cfg->i2c_periph) & I2C_STAT1_I2CBSY && timeout--)
-            {
-                rt_hw_us_delay(1);
-            }
-        }
-        else
-        {
-            LOG_D("[%s] Last message has NO_STOP flag, leaving bus active.", cfg->device_name);
-        }
-    }
-
-    I2C_CTL0(cfg->i2c_periph) &= ~I2C_CTL0_I2CEN;
-
-    rt_mutex_release(&i2c_dev->bus_mutex);
-
-    LOG_D("[%s] master_xfer exiting with code: %d", cfg->device_name, (result == RT_EOK) ? i : result);
-    if (result == RT_EOK)
-    {
-        return i;
-    }
-    else
-    {
-        return result;
-    }
-}
-
-
-static struct gd32_i2c *_get_i2c_obj(uint32_t i2c_periph)
-{
-    for (size_t i = 0; i < sizeof(i2c_objs) / sizeof(i2c_objs[0]); i++)
-    {
-        if (i2c_objs[i].config->i2c_periph == i2c_periph)
-        {
-            return &i2c_objs[i];
-        }
-    }
-    /* Should not happen in a correctly configured system. */
-    LOG_E("Cannot find i2c_obj for periph: 0x%08X", i2c_periph);
-    return RT_NULL;
-}
-
-#ifdef BSP_USING_HW_I2C0
-void I2C0_EV_IRQHandler(void)
-{
-    rt_interrupt_enter();
-
-    struct gd32_i2c *i2c_obj = _get_i2c_obj(I2C0);
-    if (i2c_obj)
-    {
-        gd32_i2c_event_handler(i2c_obj);
-    }
-
-    rt_interrupt_leave();
-}
-
-void I2C0_ER_IRQHandler(void)
-{
-    rt_interrupt_enter();
-
-    struct gd32_i2c *i2c_obj = _get_i2c_obj(I2C0);
-    if (i2c_obj)
-    {
-        gd32_i2c_error_handler(i2c_obj);
-    }
-
-    rt_interrupt_leave();
-}
-#endif
-
-
-#ifdef BSP_USING_HW_I2C1
-void I2C1_EV_IRQHandler(void)
-{
-    rt_interrupt_enter();
-
-    struct gd32_i2c *i2c_obj = _get_i2c_obj(I2C1);
-    if (i2c_obj)
-    {
-        gd32_i2c_event_handler(i2c_obj);
-    }
-
-    rt_interrupt_leave();
-}
-
-void I2C1_ER_IRQHandler(void)
-{
-    rt_interrupt_enter();
-
-    struct gd32_i2c *i2c_obj = _get_i2c_obj(I2C1);
-    if (i2c_obj)
-    {
-        gd32_i2c_error_handler(i2c_obj);
-    }
-
-    rt_interrupt_leave();
-}
-#endif
-
-
-static const struct rt_i2c_bus_device_ops gd32_i2c_ops =
-{
-    .master_xfer = gd32_i2c_master_xfer,
-    .slave_xfer  = RT_NULL,
-    .i2c_bus_control = RT_NULL,
-};
-
-int rt_hw_i2c_init(void)
-{
-    rt_size_t obj_num = sizeof(i2c_objs) / sizeof(struct gd32_i2c);
-    rt_err_t result;
-
-    for (int i = 0; i < obj_num; i++)
-    {
-        const struct gd32_i2c_config *config = &i2c_configs[i];
-        struct gd32_i2c *i2c_obj = &i2c_objs[i];
-
-        LOG_D("Initializing %s...", config->device_name);
-
-        i2c_obj->config = config;
-        i2c_obj->parent.ops = &gd32_i2c_ops;
-        i2c_obj->parent.timeout = RT_TICK_PER_SECOND;
-
-        rcu_periph_clock_enable(config->scl_clk);
-        if (config->scl_clk != config->sda_clk)
-        {
-            rcu_periph_clock_enable(config->sda_clk);
-        }
-        rcu_periph_clock_enable(config->periph_clk);
-
-        gpio_af_set(config->scl_port, config->scl_af, config->scl_pin);
-        gpio_mode_set(config->scl_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, config->scl_pin);
-        gpio_output_options_set(config->scl_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, config->scl_pin);
-
-        gpio_af_set(config->sda_port, config->sda_af, config->sda_pin);
-        gpio_mode_set(config->sda_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, config->sda_pin);
-        gpio_output_options_set(config->sda_port, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, config->sda_pin);
-
-        i2c_deinit(config->i2c_periph);
-        i2c_clock_config(config->i2c_periph, config->i2c_clock_hz, I2C_DTCY_2);
-        i2c_mode_addr_config(config->i2c_periph, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0);
-        i2c_enable(config->i2c_periph);
-        i2c_ack_config(config->i2c_periph, I2C_ACK_ENABLE);
-
-        nvic_irq_enable(config->ev_irq_type, 2);
-        nvic_irq_enable(config->er_irq_type, 1);
-
-        result = rt_i2c_bus_device_register(&i2c_obj->parent, config->device_name);
-        if (result != RT_EOK)
-        {
-            LOG_E("Failed to register i2c bus %s", config->device_name);
-            return result;
-        }
-
-        rt_mutex_init(&i2c_obj->bus_mutex,
-                  config->device_name,
-                  RT_IPC_FLAG_FIFO);
-
-        rt_completion_init(&i2c_obj->sync_sem);
-
-        LOG_I("I2C bus %s registered successfully.", config->device_name);
-    }
-    return RT_EOK;
-}
-INIT_BOARD_EXPORT(rt_hw_i2c_init);
-
-#endif /* RT_USING_I2C */
-

+ 0 - 68
bsp/gd32/arm/libraries/gd32_drivers/drv_hw_i2c.h

@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2006-2025, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- */
-
-#ifndef __DRV_HW_I2C_H__
-#define __DRV_HW_I2C_H__
-
-#include <rtthread.h>
-#include <rthw.h>
-#include <rtdevice.h>
-#include <board.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* I2C hardware configuration */
-struct gd32_i2c_config
-{
-    rt_uint32_t i2c_periph;     /* I2C peripheral base address */
-    rcu_periph_enum periph_clk; /* I2C peripheral clock */
-
-    rcu_periph_enum scl_clk;    /* SCL pin clock */
-    rt_uint32_t scl_port;       /* SCL pin port */
-    rt_uint32_t scl_pin;        /* SCL pin */
-    rt_uint32_t scl_af;         /* SCL pin alternate function */
-
-    rcu_periph_enum sda_clk;    /* SDA pin clock */
-    rt_uint32_t sda_port;       /* SDA pin port */
-    rt_uint32_t sda_pin;        /* SDA pin */
-    rt_uint32_t sda_af;         /* SDA pin alternate function */
-
-    IRQn_Type ev_irq_type;      /* Event IRQn */
-    IRQn_Type er_irq_type;      /* Error IRQn */
-
-    rt_uint32_t i2c_clock_hz;        /* I2C clock speed in Hz, e.g., 100000 for 100kHz */
-
-    const char *device_name;    /* Device name */
-};
-
-/* I2C runtime context */
-struct gd32_i2c
-{
-    struct rt_i2c_bus_device parent;
-    const struct gd32_i2c_config *config;
-
-    struct rt_mutex bus_mutex;
-    struct rt_completion sync_sem;
-    uint32_t dev_config;
-    uint16_t addr1;
-    uint16_t addr2;
-    uint32_t xfer_len;
-    struct rt_i2c_msg *current;
-    uint8_t errs;
-    rt_bool_t is_restart;
-};
-
-int rt_hw_i2c_init(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRV_HW_I2C_H__ */
-

+ 0 - 212
bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.c

@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author            Notes
- * 2021-12-20     BruceOu           the first version
- */
-#include "drv_soft_i2c.h"
-
-#ifdef RT_USING_I2C
-
-#define LOG_TAG              "drv.i2c"
-#include <rtdbg.h>
-
-#if !defined(BSP_USING_I2C0) && !defined(BSP_USING_I2C1) && !defined(BSP_USING_I2C2) && !defined(BSP_USING_I2C3)
-#error "Please define at least one BSP_USING_I2Cx"
-/* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */
-#endif
-
-static const struct gd32_soft_i2c_config soft_i2c_config[] =
-{
-#ifdef BSP_USING_I2C0
-    I2C0_BUS_CONFIG,
-#endif
-#ifdef BSP_USING_I2C1
-    I2C1_BUS_CONFIG,
-#endif
-#ifdef BSP_USING_I2C2
-    I2C2_BUS_CONFIG,
-#endif
-#ifdef BSP_USING_I2C3
-    I2C3_BUS_CONFIG,
-#endif
-};
-
-static struct gd32_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])];
-
-/**
-  * @brief  This function initializes the i2c pin.
-  * @param  i2c
-  * @retval None
-  */
-static void gd32_i2c_gpio_init(struct gd32_i2c *i2c)
-{
-    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)i2c->ops.data;
-
-    rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD);
-    rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD);
-
-    rt_pin_write(cfg->scl, PIN_HIGH);
-    rt_pin_write(cfg->sda, PIN_HIGH);
-}
-
-static void gd32_i2c_pin_init(void)
-{
-    rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c);
-
-    for(rt_size_t i = 0; i < obj_num; i++)
-    {
-        gd32_i2c_gpio_init(&i2c_obj[i]);
-    }
-}
-
-/**
-  * @brief  This function sets the sda pin.
-  * @param  data, state
-  * @retval None
-  */
-static void gd32_set_sda(void *data, rt_int32_t state)
-{
-    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)data;
-    if (state)
-    {
-        rt_pin_write(cfg->sda, PIN_HIGH);
-    }
-    else
-    {
-        rt_pin_write(cfg->sda, PIN_LOW);
-    }
-}
-
-/**
-  * @brief  This function sets the scl pin.
-  * @param  data, state
-  * @retval None
-  */
-static void gd32_set_scl(void *data, rt_int32_t state)
-{
-    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)data;
-    if (state)
-    {
-        rt_pin_write(cfg->scl, PIN_HIGH);
-    }
-    else
-    {
-        rt_pin_write(cfg->scl, PIN_LOW);
-    }
-}
-
-/**
-  * @brief  This function gets the sda pin state.
-  * @param  data
-  * @retval None
-  */
-static rt_int32_t gd32_get_sda(void *data)
-{
-    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)data;
-    return rt_pin_read(cfg->sda);
-}
-
-
-/**
-  * @brief  This function gets the scl pin state.
-  * @param  data
-  * @retval None
-  */
-static rt_int32_t gd32_get_scl(void *data)
-{
-    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)data;
-    return rt_pin_read(cfg->scl);
-}
-
-/**
-  * @brief  The time delay function.
-  * @param  us
-  * @retval None
-  */
-static void gd32_udelay(rt_uint32_t us)
-{
-    int i = ( rcu_clock_freq_get(CK_SYS) / 4000000 * us);
-    while(i)
-    {
-        i--;
-    }
-}
-
-static const struct rt_i2c_bit_ops gd32_bit_ops_default =
-{
-    .data     = RT_NULL,
-    .pin_init = gd32_i2c_pin_init,
-    .set_sda  = gd32_set_sda,
-    .set_scl  = gd32_set_scl,
-    .get_sda  = gd32_get_sda,
-    .get_scl  = gd32_get_scl,
-    .udelay   = gd32_udelay,
-    .delay_us = 1,
-    .timeout  = 100,
-    .i2c_pin_init_flag = RT_FALSE
-};
-
-/**
-  * @brief  if i2c is locked, this function will unlock it
-  * @param  cfg
-  * @retval RT_EOK indicates successful unlock.
-  */
-static rt_err_t gd32_i2c_bus_unlock(const struct gd32_soft_i2c_config *cfg)
-{
-    rt_int32_t i = 0;
-
-    if (PIN_LOW == rt_pin_read(cfg->sda))
-    {
-        while (i++ < 9)
-        {
-            rt_pin_write(cfg->scl, PIN_HIGH);
-            gd32_udelay(100);
-            rt_pin_write(cfg->scl, PIN_LOW);
-            gd32_udelay(100);
-        }
-    }
-    if (PIN_LOW == rt_pin_read(cfg->sda))
-    {
-        return -RT_ERROR;
-    }
-
-    return RT_EOK;
-}
-
-/**
-  * @brief  I2C initialization function
-  * @param  None
-  * @retval RT_EOK indicates successful initialization.
-  */
-int rt_hw_i2c_init(void)
-{
-    rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c);
-    rt_err_t result;
-
-    for (rt_size_t i = 0; i < obj_num; i++)
-    {
-        i2c_obj[i].ops = gd32_bit_ops_default;
-        i2c_obj[i].ops.data = (void*)&soft_i2c_config[i];
-        i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops;
-
-        result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name);
-
-        RT_ASSERT(result == RT_EOK);
-
-        gd32_i2c_bus_unlock(&soft_i2c_config[i]);
-
-        LOG_D("software simulation %s init done, pin scl: %d, pin sda %d",
-        soft_i2c_config[i].bus_name,
-        soft_i2c_config[i].scl,
-        soft_i2c_config[i].sda);
-    }
-
-    return RT_EOK;
-}
-INIT_BOARD_EXPORT(rt_hw_i2c_init);
-
-#endif /* RT_USING_I2C */

+ 0 - 78
bsp/gd32/arm/libraries/gd32_drivers/drv_soft_i2c.h

@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author       Notes
- * 2021-12-20     BruceOu      the first version
- */
-
-#ifndef __DRV_I2C__
-#define __DRV_I2C__
-
-#include <rtthread.h>
-#include <rthw.h>
-#include <rtdevice.h>
-#include <board.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* gd32 config class */
-struct gd32_soft_i2c_config
-{
-    rt_uint8_t scl;
-    rt_uint8_t sda;
-    const char *bus_name;
-};
-
-/* gd32 i2c dirver class */
-struct gd32_i2c
-{
-    struct rt_i2c_bit_ops ops;
-    struct rt_i2c_bus_device i2c_bus;
-};
-
-#ifdef BSP_USING_I2C0
-#define I2C0_BUS_CONFIG                                  \
-    {                                                    \
-        .scl = BSP_I2C0_SCL_PIN,                         \
-        .sda = BSP_I2C0_SDA_PIN,                         \
-        .bus_name = "i2c0",                              \
-    }
-#endif
-
-#ifdef BSP_USING_I2C1
-#define I2C1_BUS_CONFIG                                  \
-    {                                                    \
-        .scl = BSP_I2C1_SCL_PIN,                         \
-        .sda = BSP_I2C1_SDA_PIN,                         \
-        .bus_name = "i2c1",                              \
-    }
-#endif
-
-#ifdef BSP_USING_I2C2
-#define I2C2_BUS_CONFIG                                  \
-    {                                                    \
-        .scl = BSP_I2C2_SCL_PIN,                         \
-        .sda = BSP_I2C2_SDA_PIN,                         \
-        .bus_name = "i2c2",                              \
-    }
-#endif
-
-#ifdef BSP_USING_I2C3
-#define I2C3_BUS_CONFIG                                  \
-    {                                                    \
-        .scl = BSP_I2C3_SCL_PIN,                         \
-        .sda = BSP_I2C3_SDA_PIN,                         \
-        .bus_name = "i2c3",                              \
-    }
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRV_I2C__ */