关于ar9331 gpio调试遇到的问题
小白今天又踩坑,又有一個填坑的經驗
源碼:
首先介紹一下關鍵源碼的說明,加紅色說明是需要注意的地方
#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));//信號量響應,將相應的IO口設置輸入ioctl(gpio_dev_fd, GPIO_CONTROL_FREE_GPIO, GPIO_IOCTL_PRAM(mcu_gpio_pin, 0));//信號量響應,釋放相應的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??? 注冊相應的信號量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,取得了相應的gpio的資源,
在終端輸入ctrl+c 釋放相應的gpio的資源:
遇到的問題:
下次代碼運行的時候,無法重新設置相應的IO口
?
調試方法:
在虛擬機中
步驟一
修改gpio_control_driver.c
進入相應的驅動目錄:
~/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為新生成的驅動
步驟二
在開發板中
進入開發板的命令行終端:
首先卸載掉以前的驅動
原有的驅動程序加載模塊在目錄
root@AOTUO:/lib/modules/4.4.79#
輸入命令行:rmmod? gpio_control_driver.ko
?
將新生成的驅動傳輸到當前目錄
?
輸入命令行:insmod gpio_control_driver.ko
?
重新加入驅動模塊
?
步驟三
在命令行終端運行相應的app程序,
?
?
發現錯誤信息打印,request GPIO 18 error
?
進入內核日志,查看打印信息
?
?
發現驅動中的打印GPIO_CONTROL_REQUEST_GPIO 返回值為-16
?
解決問題:
Linux中調用gpio_request申請一個GPIO時返回錯誤碼-16,原因是前面已經用gpio_request對同一個GPIO做了申請操作。可以把前面的GPIO用gpio_free先釋放再改作它用。
這是因為ctrl+c信號量那邊只釋放了一個IO口的資源,另一個沒有進行釋放。下次調用的時候會出現調用失敗的情況
一般來說,一個GPIO只是分配給一個設備的,所以這個設備的驅動會請求這個GPIO。這樣,在其他的設備也想請求這個GPIO的時候會返回失敗。事實上,gpio_request只是給這個GPIO做一個標示,并沒有什么實質的作用。操作GPIO是通過gpio_set_value、gpio_direction_output之類的函數去做的,即便沒有request,一樣可以設置GPIO的電平。
?
結束進程的時候,將相應的io口資源進行釋放
后記:
一個實用的命令
?? find –iname ?文件名?????????????????? //查找
實用的快捷鍵
在命令行終端
Ctrl+shirt+n???????????????????????????? //多窗口
下面這一篇是關于led驅動的開發應用流程,可以作為參考
https://www.jianshu.com/p/e5ffb5ecbf39
總結
以上是生活随笔為你收集整理的关于ar9331 gpio调试遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap框架过时了吗_浅议bo
- 下一篇: 使用urllib发起请求- urlope