gpio.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: gpio.c
  4. 文件版本: 01.01
  5. 创建作者: zhaoyang
  6. 创建日期: 2023-12-14
  7. 功能说明: gpio驱动程序。
  8. 其它说明:
  9. 修改记录:
  10. [new]-->applay
  11. B_DO_ADJ --> GPIOD_17 --> gpio113 预置返校
  12. B_DO_0 --> GPIOD_03 --> gpio99 预置
  13. B_DO_1 --> GPIOD_19 --> gpio115
  14. B_DO_2 --> GPIOD_02 --> gpio98
  15. B_DO_3 --> GPIOD_09 --> gpio105
  16. B_DO_4 --> GPIOD_18 --> gpio114
  17. B_DO_5 --> GPIOD_16 --> gpio112
  18. B_DO_6 --> GPIOD_07 --> gpio103
  19. B_DO_7 --> GPIOD_08 --> gpio104
  20. B_DO_8 --> GPIOD_06 --> gpio102
  21. M1 开入 --> GPIOI_11 --> gpio267
  22. M3 采样 --> GPIOI_10 --> gpio266
  23. M4 开出 --> GPIOA_02 --> gpio2
  24. T536 start ↓↓↓↓↓↓
  25. RUN_LED --> PB7 --> gpio39
  26. ERR_LED --> PF4 --> gpio164
  27. ESAM_PWR --> PL7 --> gpio159
  28. LINE_LOSS_SET --> PM5 --> gpio389
  29. T536 end ↑↑↑↑↑↑
  30. */
  31. /*------------------------------- 头文件 --------------------------------------
  32. */
  33. #include "bspconfig.h"
  34. #include "gpio.h"
  35. #include "head.h"
  36. #include <rtdm/gpio.h>
  37. /*------------------------------- 宏定义 --------------------------------------
  38. */
  39. #if CFG_BSP_DEBUG
  40. #define _GPIO_DEBUG
  41. #endif
  42. #define GPIO_LOW 0
  43. #define GPIO_INPUT 0
  44. #define GPIO_OUTPUT 1
  45. #define NEW_GOIO_VERSION 1
  46. /*------------------------------ 全局变量 -------------------------------------
  47. */
  48. typedef enum
  49. {
  50. SYS_GPIO = 0,
  51. RTDM_GPIO = 1,
  52. } GPIO_TYPE;
  53. unsigned short kc_kout0_stu;
  54. extern uint32_t g_yx_buf[2]; // 预留64个遥信
  55. /*------------------------------ 函数声明 -------------------------------------
  56. */
  57. extern unsigned int change_di_ch(unsigned int di);
  58. #if (0 == NEW_GOIO_VERSION)
  59. int gpio_val_fd[DO_NUM];
  60. int gpio_dev_type[DO_NUM] = {
  61. SYS_GPIO,
  62. }; // 0:系统GPIO, 1:RTDM GPIO
  63. /* 开出gpio */
  64. const int gpio_val[DO_NUM] = {115, 98, 105, 114, 112, 103, 104, 102, 99, 113};
  65. #else
  66. struct t_goio_cfg
  67. {
  68. int l_pin_num; // 引脚号
  69. int l_pin_fd; // 句柄
  70. int l_pin_type; // 类型 0:系统GPIO, 1:RTDM GPIO
  71. int l_pin_dir; // 方向 GPIO_INPUT 0 输入, GPIO_OUTPUT 1 输出
  72. };
  73. static struct t_goio_cfg mst_gpio_cfg[GPIO_NUM_TOTAL] =
  74. {
  75. {115, -1, -1, GPIO_OUTPUT},
  76. {98, -1, -1, GPIO_OUTPUT},
  77. {105, -1, -1, GPIO_OUTPUT},
  78. {114, -1, -1, GPIO_OUTPUT},
  79. {112, -1, -1, GPIO_OUTPUT},
  80. {103, -1, -1, GPIO_OUTPUT},
  81. {104, -1, -1, GPIO_OUTPUT},
  82. {102, -1, -1, GPIO_OUTPUT},
  83. {99, -1, -1, GPIO_OUTPUT},
  84. {113, -1, -1, GPIO_INPUT},
  85. {267, -1, -1, GPIO_INPUT},
  86. {266, -1, -1, GPIO_INPUT},
  87. {2, -1, -1, GPIO_INPUT},
  88. };
  89. #endif
  90. // static int gpio_watchdog_val = 0;
  91. static int gpio_run_led_val = 0;
  92. /*------------------------------ 外部函数 -------------------------------------
  93. */
  94. int sysfs_gpio_unexport(int gpio)
  95. {
  96. char path[64];
  97. int fd;
  98. snprintf(path, sizeof(path), "/sys/class/gpio/unexport");
  99. fd = open(path, O_WRONLY);
  100. if (fd < 0)
  101. {
  102. perror("Failed to open unexport");
  103. return -1;
  104. }
  105. char buf[16];
  106. snprintf(buf, sizeof(buf), "%d", gpio);
  107. if (write(fd, buf, strlen(buf)) < 0)
  108. {
  109. perror("Failed to set GPIO");
  110. close(fd);
  111. return -1;
  112. }
  113. close(fd);
  114. return 0;
  115. }
  116. int sysfs_gpio_export(int gpio)
  117. {
  118. char path[64];
  119. int fd;
  120. // 检查是否已导出
  121. snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d", gpio);
  122. if (access(path, F_OK) == 0)
  123. {
  124. sysfs_gpio_unexport(gpio); // bugfix: 避免重复导出
  125. msleep(50); // 短暂等待让内核处理
  126. }
  127. snprintf(path, sizeof(path), "/sys/class/gpio/export");
  128. fd = open(path, O_WRONLY);
  129. if (fd < 0)
  130. {
  131. perror("Failed to open export");
  132. return -1;
  133. }
  134. char buf[16];
  135. snprintf(buf, sizeof(buf), "%d", gpio);
  136. if (write(fd, buf, strlen(buf)) < 0)
  137. {
  138. perror("Failed to export GPIO");
  139. close(fd);
  140. return -2;
  141. }
  142. close(fd);
  143. return 0;
  144. }
  145. int sysfs_gpio_set_direction(int gpio, int is_output)
  146. {
  147. char path[64];
  148. int fd;
  149. snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", gpio);
  150. fd = open(path, O_WRONLY);
  151. if (fd < 0)
  152. {
  153. perror("Failed to open direction");
  154. return -1;
  155. }
  156. if (write(fd, is_output ? "out" : "in", is_output ? 3 : 2) < 0)
  157. {
  158. perror("Failed to set direction");
  159. close(fd);
  160. return -1;
  161. }
  162. close(fd);
  163. return 0;
  164. }
  165. int sysfs_gpio_set_edge_detect(int gpio, int edge)
  166. {
  167. char path[64];
  168. int fd;
  169. snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", gpio);
  170. fd = open(path, O_WRONLY);
  171. if (fd < 0)
  172. {
  173. perror("Failed to open edge");
  174. close(fd);
  175. return -1;
  176. }
  177. if (write(fd, edge, strlen(edge)) < 0)
  178. {
  179. perror("Failed to set edge");
  180. close(fd);
  181. return -1;
  182. }
  183. close(fd);
  184. return 0;
  185. }
  186. int sysfs_gpio_set_value(int gpio, int value)
  187. {
  188. char path[64];
  189. int fd = -1;
  190. snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", gpio);
  191. fd = open(path, O_WRONLY);
  192. if (fd < 0)
  193. {
  194. perror("Failed to open value");
  195. return -1;
  196. }
  197. if (write(fd, value ? "1" : "0", 1) < 0)
  198. {
  199. perror("Failed to set value");
  200. close(fd);
  201. return -1;
  202. }
  203. return fd;
  204. }
  205. int sysfs_gpio_get_value(int gpio)
  206. {
  207. char path[64];
  208. int fd = -1;
  209. int value = 0;
  210. snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", gpio);
  211. fd = open(path, O_RDONLY);
  212. if (fd < 0)
  213. {
  214. perror("Failed to open value");
  215. return -1;
  216. }
  217. if (read(fd, value, 1) < 0)
  218. {
  219. perror("Failed to get value");
  220. close(fd);
  221. return -1;
  222. }
  223. return fd;
  224. }
  225. int sysfs_gpio_init(int gpio, int direction)
  226. {
  227. int ret;
  228. ret = sysfs_gpio_export(gpio);
  229. if (ret < 0)
  230. {
  231. dp_err_n_c("sysfs_gpio_export error ret = %d!", ret);
  232. return -1;
  233. }
  234. ret = sysfs_gpio_set_direction(gpio, direction);
  235. if (ret < 0)
  236. {
  237. dp_err_n_c("sysfs_gpio_set_direction error");
  238. }
  239. if (GPIO_INPUT == direction)
  240. {
  241. return sysfs_gpio_get_value(gpio);
  242. }
  243. else
  244. {
  245. return sysfs_gpio_set_value(gpio, GPIO_LOW); // 初始化IO为低电平
  246. }
  247. }
  248. int is_rtdm_device(int fd)
  249. {
  250. #if (0 == NEW_GOIO_VERSION)
  251. if (gpio_dev_type[fd] > SYS_GPIO)
  252. return 1;
  253. else if (gpio_dev_type[fd] == SYS_GPIO)
  254. return 0;
  255. else
  256. return -1;
  257. #else
  258. if (mst_gpio_cfg[fd].l_pin_type > SYS_GPIO)
  259. return 1;
  260. else if (mst_gpio_cfg[fd].l_pin_type == SYS_GPIO)
  261. return 0;
  262. else
  263. return -1;
  264. #endif
  265. }
  266. int rt_write(int fd, char *buf, int len)
  267. {
  268. int value;
  269. if (len <= 0 || buf == NULL)
  270. {
  271. return -1;
  272. }
  273. if (is_rtdm_device(fd) == 1)
  274. {
  275. value = atoi(buf);
  276. if (value != 0 && value != 1)
  277. {
  278. dp_err_n_c("value :%d ERR, Please enter '0' or '1'", value);
  279. return -1;
  280. }
  281. return write(fd, &value, sizeof(value));
  282. }
  283. else
  284. {
  285. return write(fd, buf, len);
  286. }
  287. }
  288. int rt_read(int _l_fd, int *_l_state, int len)
  289. {
  290. int ret = 0, l_val = -1;
  291. if (is_rtdm_device(_l_fd) == 1)
  292. {
  293. ret = read(_l_fd, &l_val, sizeof(l_val));
  294. if (ret < 0 || ret != sizeof(l_val))
  295. {
  296. dp_err_n_c("Failed to read from RTDM device, ret=%d", ret);
  297. return -1;
  298. }
  299. *_l_state = l_val;
  300. }
  301. else
  302. {
  303. ret = read(_l_fd, &l_val, len);
  304. dp_err_n_c("ret=%d", ret);
  305. if (ret < 0)
  306. {
  307. dp_err_n_c("Failed to read from regular device");
  308. return -1;
  309. }
  310. *_l_state = l_val;
  311. }
  312. return ret;
  313. }
  314. int rtdm_gpio_init(int gpio, int direction)
  315. {
  316. char path[64];
  317. int fd = -1, ret;
  318. int value = 1;
  319. snprintf(path, sizeof(path), "/dev/rtdm/3604000.pinctrl/gpio%d", gpio);
  320. if (GPIO_INPUT == direction)
  321. {
  322. fd = open(path, O_RDWR | O_NONBLOCK);
  323. }
  324. else
  325. {
  326. fd = open(path, O_RDWR);
  327. }
  328. if (fd < 0)
  329. {
  330. dp_err_n_c("gpio [%d] open error", gpio);
  331. perror("open");
  332. return -1;
  333. }
  334. if (GPIO_INPUT == direction)
  335. {
  336. ret = ioctl(fd, GPIO_RTIOC_DIR_IN, &value);
  337. }
  338. else
  339. {
  340. ret = ioctl(fd, GPIO_RTIOC_DIR_OUT, &value);
  341. }
  342. if (ret < 0)
  343. {
  344. dp_err_n_c("gpio [%d] ioctl error", gpio);
  345. perror("gpio ioctl err");
  346. close(fd);
  347. return -1;
  348. }
  349. return fd;
  350. }
  351. int gpio_init(void)
  352. {
  353. int i;
  354. #if (0 == NEW_GOIO_VERSION)
  355. for (i = 0; i < DO_NUM; i++)
  356. {
  357. gpio_val_fd[i] = rtdm_gpio_init(gpio_val[i], GPIO_OUTPUT);
  358. if (gpio_val_fd[i] < 0)
  359. {
  360. gpio_val_fd[i] = sysfs_gpio_init(gpio_val[i], GPIO_OUTPUT);
  361. dp_info_n_c("gpio_val_fd[%02d] = %d", i, gpio_val_fd[i]);
  362. if (gpio_val_fd[i] < 0)
  363. {
  364. dp_err_n_c("gpio_val_fd[%d] error", i);
  365. gpio_val_fd[i] = -1;
  366. gpio_dev_type[i] = -1;
  367. return -1;
  368. }
  369. }
  370. else
  371. {
  372. gpio_dev_type[i] = gpio_val_fd[i]; // 保存RTDM设备类型句柄,这里有风险,fd句柄可能为0
  373. }
  374. }
  375. msleep(10); // 延时10ms
  376. kc_kout0_stu = 0;
  377. for (i = DO_OUT1; i < DO_NUM; i++)
  378. {
  379. rt_write(gpio_val_fd[i], "1", 2);
  380. }
  381. return 0;
  382. #else
  383. for (i = 0; i < GPIO_NUM_TOTAL; i++)
  384. {
  385. mst_gpio_cfg[i].l_pin_fd = rtdm_gpio_init(mst_gpio_cfg[i].l_pin_num, mst_gpio_cfg[i].l_pin_dir);
  386. if (mst_gpio_cfg[i].l_pin_fd < 0)
  387. {
  388. mst_gpio_cfg[i].l_pin_fd = sysfs_gpio_init(mst_gpio_cfg[i].l_pin_num, mst_gpio_cfg[i].l_pin_dir);
  389. if (mst_gpio_cfg[i].l_pin_fd < 0)
  390. {
  391. dp_err_n_c("mst_gpio_cfg[%d].l_pin_fd error", i);
  392. mst_gpio_cfg[i].l_pin_fd = -1;
  393. mst_gpio_cfg[i].l_pin_type = -1;
  394. return -1;
  395. }
  396. }
  397. else
  398. {
  399. mst_gpio_cfg[i].l_pin_type = mst_gpio_cfg[i].l_pin_fd; // 保存RTDM设备类型句柄,这里有风险,fd句柄可能为0
  400. }
  401. }
  402. msleep(10); // 延时10ms
  403. kc_kout0_stu = 0;
  404. for (i = 0; i < (DO_NUM - 1); i++)
  405. {
  406. rt_write(mst_gpio_cfg[i].l_pin_fd, "1", 2);
  407. }
  408. return 0;
  409. #endif
  410. }
  411. int gpio_exit(void)
  412. {
  413. int i;
  414. for (i = 0; i < DO_NUM; i++)
  415. {
  416. #if (0 == NEW_GOIO_VERSION)
  417. if (gpio_val_fd[i] >= 0)
  418. {
  419. close(gpio_val_fd[i]);
  420. gpio_val_fd[i] = -1;
  421. }
  422. sysfs_gpio_unexport(gpio_val[i]);
  423. #else
  424. if (mst_gpio_cfg[i].l_pin_fd >= 0)
  425. {
  426. close(mst_gpio_cfg[i].l_pin_fd);
  427. mst_gpio_cfg[i].l_pin_fd = -1;
  428. }
  429. sysfs_gpio_unexport(mst_gpio_cfg[i].l_pin_num);
  430. #endif
  431. }
  432. return 0;
  433. }
  434. /******************************************************************************
  435. 函数名称: gpio_get_di
  436. 函数版本: 01.01
  437. 创建作者:
  438. 创建日期: 2014-11-28
  439. 函数说明: 得到开入的状态
  440. 参数说明: 无
  441. 返回值: 返回开入的状态,每个bit代表一个开入量。
  442. 修改记录:
  443. */
  444. unsigned int gpio_get_di(void)
  445. {
  446. unsigned int dw = 0;
  447. dw = g_yx_buf[0]; // 这里保存的是共享内存的yx值,156us更新一次
  448. return change_di_ch(~dw); // 取反---因为没有短接时,值为1. 所以要取反为0才行
  449. }
  450. /******************************************************************************
  451. 函数名称: gpio_di_fj
  452. 函数版本: 01.01
  453. 创建作者:
  454. 创建日期: 2014-11-28
  455. 函数说明: 读取开出返校遥信值,控制板遥信为YX17~YX18
  456. YX17:选择, YX18:执行
  457. 参数说明: 无
  458. 返回值: 返回遥信值
  459. 修改记录:
  460. */
  461. #ifdef DO_KOUT_CHECK
  462. unsigned short gpio_di_fj(unsigned char index) //(void)
  463. #else
  464. unsigned short gpio_di_fj(void)
  465. #endif
  466. {
  467. unsigned int di = 0;
  468. unsigned short ret = 0;
  469. di = gpio_get_di();
  470. #ifdef DO_KOUT_CHECK
  471. ret = (unsigned short)((di >> index) & 0x0001);
  472. #else
  473. ret = (unsigned short)((di >> 23) & 0x0001);
  474. #endif
  475. return ret;
  476. }
  477. /**
  478. * @brief 读取gpio的状态
  479. * @author lch (lch_work@foxmail.com)
  480. * @version 1.0
  481. * @date 20260311
  482. * @param[in/out] {uint8_t} _uc_idx 下标
  483. * @return * int
  484. * @retval none
  485. *
  486. * @warning none
  487. * @note none
  488. */
  489. int gpioio_get_gpio_status(uint8_t _uc_idx)
  490. {
  491. int ret, l_io_state = 0;
  492. if (_uc_idx < DO_IN_PRESET || _uc_idx > GPIO_INT_M4)
  493. return -1;
  494. ret = rt_read(mst_gpio_cfg[_uc_idx].l_pin_fd, &l_io_state, sizeof(l_io_state));
  495. if (ret < 0)
  496. {
  497. dp_err_n_c("l_io_state: %d\r\n", l_io_state);
  498. return -2;
  499. }
  500. return l_io_state;
  501. }
  502. /******************************************************************************
  503. 函数名称: gpio_kout_do
  504. 函数版本: 01.01
  505. 创建作者:
  506. 创建日期: 2014-11-28
  507. 函数说明: 开出
  508. 参数说明: on: 1开出, 0回收
  509. kout: 那一路
  510. 返回值: 无
  511. 修改记录:
  512. */
  513. int gpio_kout_do(int on, unsigned int kout)
  514. {
  515. int l_ret = -1;
  516. if (kout > DO_OUT_PRESET)
  517. return;
  518. #if (0 == NEW_GOIO_VERSION)
  519. if (on)
  520. {
  521. l_ret = rt_write(gpio_val_fd[kout + DO_OUT0], "0", 2);
  522. // dp_info_n_c("kout = %d, on = %d, l_ret = %d", kout, on, l_ret);
  523. }
  524. else
  525. {
  526. l_ret = rt_write(gpio_val_fd[kout + DO_OUT0], "1", 2);
  527. // dp_info_n_c("kout = %d, on = %d, l_ret = %d", kout, on, l_ret);
  528. }
  529. #else
  530. if (on)
  531. {
  532. l_ret = rt_write(mst_gpio_cfg[kout + DO_OUT0].l_pin_fd, "0", 2);
  533. // dp_info_n_c("kout = %d, on = %d, l_ret = %d", kout, on, l_ret);
  534. }
  535. else
  536. {
  537. l_ret = rt_write(mst_gpio_cfg[kout + DO_OUT0].l_pin_fd, "1", 2);
  538. // dp_info_n_c("kout = %d, on = %d, l_ret = %d", kout, on, l_ret);
  539. }
  540. #endif
  541. return l_ret;
  542. }
  543. /******************************************************************************
  544. 函数名称: gpio_get_wirelessin
  545. 函数版本: 01.01
  546. 创建作者: sunxi
  547. 创建日期: 2008-09-16
  548. 函数说明: 得到无线遥控的状态。
  549. 参数说明: 无
  550. 返回值: 返回开入的状态,每个bit代表一个开入量。
  551. 修改记录:
  552. */
  553. unsigned int gpio_get_wirelessin(void)
  554. {
  555. register unsigned int dw = 0;
  556. return dw;
  557. }
  558. unsigned int gpio_get_version(void)
  559. {
  560. register unsigned int dw = 0;
  561. return dw;
  562. }
  563. unsigned int gpio_get_addr(void)
  564. {
  565. register unsigned int dw = 0;
  566. return dw;
  567. }
  568. void _led_run_err(void)
  569. {
  570. // 上电就亮错误灯,有错误就继续亮没有就熄灭
  571. static uint8 err_led = 2;
  572. if (rt_err_count())
  573. {
  574. // 错误指示灯常亮且运行熄灭
  575. if (!(err_led & 0x01))
  576. {
  577. err_led |= 1;
  578. // write(gpio_val_fd_other[ERR_LED], "0", 2);
  579. // write(gpio_val_fd_other[RUN_LED], "1", 2);
  580. }
  581. return;
  582. }
  583. if (err_led)
  584. {
  585. err_led = 0;
  586. // write(gpio_val_fd_other[ERR_LED], "1", 2);
  587. }
  588. // 运行指示灯,每隔1s改变状态一次
  589. if (!gpio_run_led_val)
  590. {
  591. gpio_run_led_val = 1;
  592. // write(gpio_val_fd_other[RUN_LED], "0", 2);
  593. }
  594. else
  595. {
  596. gpio_run_led_val = 0;
  597. // write(gpio_val_fd_other[RUN_LED], "1", 2);
  598. }
  599. }
  600. void esam_power_ctrl(int on)
  601. {
  602. // if (on)
  603. // write(gpio_val_fd_other[ESAM_PWR], "1", 2);
  604. // else
  605. // write(gpio_val_fd_other[ESAM_PWR], "0", 2);
  606. }
  607. /*------------------------------ 内部函数 -------------------------------------
  608. */
  609. /*------------------------------ 测试函数 -------------------------------------
  610. */
  611. #if (0)
  612. int test_read_pin(void)
  613. {
  614. int ret, l_io_state = 0;
  615. dp_info_n_c("test_read_pin!");
  616. ret = rt_read(mst_gpio_cfg[GPIO_INT_M1].l_pin_fd, &l_io_state, sizeof(l_io_state));
  617. dp_info_n_c("ret: %d", ret);
  618. if (ret > 0)
  619. {
  620. dp_info_n_c("l_io_state: %d\r\n", l_io_state);
  621. }
  622. else
  623. {
  624. dp_err_n_c("l_io_state: %d\r\n", l_io_state);
  625. }
  626. ret = rt_read(mst_gpio_cfg[GPIO_INT_M3].l_pin_fd, &l_io_state, sizeof(l_io_state));
  627. dp_info_n_c("ret: %d", ret);
  628. if (ret > 0)
  629. {
  630. dp_info_n_c("l_io_state: %d\r\n", l_io_state);
  631. }
  632. else
  633. {
  634. dp_err_n_c("l_io_state: %d\r\n", l_io_state);
  635. }
  636. ret = rt_read(mst_gpio_cfg[GPIO_INT_M4].l_pin_fd, &l_io_state, sizeof(l_io_state));
  637. dp_info_n_c("ret: %d", ret);
  638. if (ret > 0)
  639. {
  640. dp_info_n_c("l_io_state: %d\r\n", l_io_state);
  641. }
  642. else
  643. {
  644. dp_err_n_c("l_io_state: %d\r\n", l_io_state);
  645. }
  646. }
  647. #endif