日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于ar9331 gpio调试遇到的问题

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于ar9331 gpio调试遇到的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小白今天又踩坑,又有一個填坑的經(jīng)驗

源碼:

首先介紹一下關(guān)鍵源碼的說明,加紅色說明是需要注意的地方

#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include " gpio_control_app.h" #include "errno.h" //static unsigned char gpio_pin;//define GPIOs to be use static int gpio_dev_fd = -1;;int mcu_gpio_pin = 12; int work_gpio_pin = 18;void mcu_gpio_release(int signal_no) {ioctl(gpio_dev_fd, GPIO_CONTROL_SET_IN, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));//信號量響應(yīng),將相應(yīng)的IO口設(shè)置輸入ioctl(gpio_dev_fd, GPIO_CONTROL_FREE_GPIO, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));//信號量響應(yīng),釋放相應(yīng)的IO口資源exit(0); }void bsp_gpio_init(void) {gpio_dev_fd = open(GPIO_CONTROL_DEVICE_PATH, O_RDWR);//open gpio deviceif (gpio_dev_fd < 0){printf("###open %s ERROR###\n", GPIO_CONTROL_DEVICE_PATH);}else{printf("***open %s success***\n", GPIO_CONTROL_DEVICE_PATH);}}int set_work_gpio(void) {int ret = 0;if(gpio_dev_fd == -1){return -1;}printf("work_gpio_pin:%d\n", work_gpio_pin);ret =ioctl(gpio_dev_fd, GPIO_CONTROL_REQUEST_GPIO, GPIO_IOCTL_PRAM(work_gpio_pin, 0));printf("%s\n",strerror(errno));printf("set_gpio ret = %d\n",ret);if (ret < 0){printf("###request GPIO %d error###", work_gpio_pin);return -1;}ret = ioctl(gpio_dev_fd, GPIO_CONTROL_SET_OUT, GPIO_IOCTL_PRAM(work_gpio_pin, 0));if (ret < 0){printf("###set GPIO %d output error###", work_gpio_pin);return -1;???}return 1; }int bsp_work_gpio_ctrl(int gpio_state) {if(gpio_dev_fd == -1){return -1;}if(gpio_state == 0){ioctl(gpio_dev_fd, GPIO_CONTROL_SET_VALUE, GPIO_IOCTL_PRAM(work_gpio_pin, 0));printf("###set work_gpio low ###\r\n");}else{ioctl(gpio_dev_fd, GPIO_CONTROL_SET_VALUE, GPIO_IOCTL_PRAM(work_gpio_pin, 1));printf("###set work_gpio high ###\r\n");}return 0; } int set_mcu_gpio(void) {int ret;if(gpio_dev_fd == -1){return -1;}printf("mcu_gpio_pin:%d\n", mcu_gpio_pin);ret = ioctl(gpio_dev_fd, GPIO_CONTROL_REQUEST_GPIO, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));printf("bsp_mcu_gpio_ctrl ret = %d\n",ret);if (ret < 0){printf("###request GPIO %d error###\n", mcu_gpio_pin);return -1;}ret = ioctl(gpio_dev_fd, GPIO_CONTROL_SET_OUT, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));if (ret < 0){printf("###set GPIO %d output error###", mcu_gpio_pin);return -1;???}return 1; }int bsp_mcu_gpio_ctrl(void) {signal(SIGINT, mcu_gpio_release);//register terminal signa??? 注冊相應(yīng)的信號量ioctl(gpio_dev_fd, GPIO_CONTROL_SET_VALUE, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));printf("### mcu_gpio_pin high###\r\n");return 0;}int main(int argc, char *argv[]) {bsp_gpio_init();set_work_gpio();set_mcu_gpio();bsp_mcu_gpio_ctrl();while(1){bsp_work_gpio_ctrl(1);sleep(1);bsp_work_gpio_ctrl(0);sleep(1);}return 1;}

?

代碼中先通過GPIO_CONTROL_REQUEST_GPIO取得了相應(yīng)的gpio的資源,

在終端輸入ctrl+c 釋放相應(yīng)的gpio的資源:

遇到的問題:

下次代碼運行的時候,無法重新設(shè)置相應(yīng)的IO

?

調(diào)試方法:

在虛擬機中

步驟一

修改gpio_control_driver.c

進入相應(yīng)的驅(qū)動目錄:

~/lede_AR9331_zhuotk_source_32bit/package/kernel/gpio_control_driver/src$

打開gpio_control_driver.c

GPIO_CONTROL_REQUEST_GPIO下的打印信息打開

?

?make menuconfig 進行選擇

重新進行make V=s編譯

找到生成的.ko文件

~/lede_AR9331_zhuotk_source_32bit/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/gpio_control_driver$

gpio_control_driver.ko為新生成的驅(qū)動

步驟二

在開發(fā)板中

進入開發(fā)板的命令行終端:

首先卸載掉以前的驅(qū)動

原有的驅(qū)動程序加載模塊在目錄

root@AOTUO:/lib/modules/4.4.79#

輸入命令行:rmmod? gpio_control_driver.ko

?

將新生成的驅(qū)動傳輸?shù)疆斍澳夸?/p>

?

輸入命令行:insmod gpio_control_driver.ko

?

重新加入驅(qū)動模塊

?

步驟三

在命令行終端運行相應(yīng)的app程序,

?

?

發(fā)現(xiàn)錯誤信息打印,request GPIO 18 error

?

進入內(nèi)核日志,查看打印信息

?

?

發(fā)現(xiàn)驅(qū)動中的打印GPIO_CONTROL_REQUEST_GPIO 返回值為-16

?

解決問題:

Linux中調(diào)用gpio_request申請一個GPIO時返回錯誤碼-16,原因是前面已經(jīng)用gpio_request對同一個GPIO做了申請操作。可以把前面的GPIO用gpio_free先釋放再改作它用。

這是因為ctrl+c信號量那邊只釋放了一個IO口的資源,另一個沒有進行釋放。下次調(diào)用的時候會出現(xiàn)調(diào)用失敗的情況

一般來說,一個GPIO只是分配給一個設(shè)備的,所以這個設(shè)備的驅(qū)動會請求這個GPIO。這樣,在其他的設(shè)備也想請求這個GPIO的時候會返回失敗。事實上,gpio_request只是給這個GPIO做一個標示,并沒有什么實質(zhì)的作用。操作GPIO是通過gpio_set_value、gpio_direction_output之類的函數(shù)去做的,即便沒有request,一樣可以設(shè)置GPIO的電平。

?

結(jié)束進程的時候,將相應(yīng)的io口資源進行釋放

后記:

一個實用的命令

?? find –iname ?文件名?????????????????? //查找

實用的快捷鍵

在命令行終端

Ctrl+shirt+n???????????????????????????? //多窗口

下面這一篇是關(guān)于led驅(qū)動的開發(fā)應(yīng)用流程,可以作為參考

https://www.jianshu.com/p/e5ffb5ecbf39

總結(jié)

以上是生活随笔為你收集整理的关于ar9331 gpio调试遇到的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。