Linux驱动——驱动模块初次加载成功,后面失败 failed with error -38
生活随笔
收集整理的這篇文章主要介紹了
Linux驱动——驱动模块初次加载成功,后面失败 failed with error -38
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
個人聲明:轉發請注明出處,個人原創,實屬不易。本人水平有限,文章若有不妥之處,還請留言批評指正,不勝感激。
設備樹下platform的驅動模塊加載 failed with error -38
初次加載成功,后面均無法加載,必須重啟開發板才能重新加載,運行提示如下:
/lib/modules/4.1.15 # depmod /lib/modules/4.1.15 # modprobe dtsplatformled.ko dts platform led probe! node is found! led-gpio num = 3 major is 249, minor is 0 /lib/modules/4.1.15 # depmod /lib/modules/4.1.15 # rmmod dtsplatformled.ko dts platform led remove! /lib/modules/4.1.15 # modprobe dtsplatformled.ko dts platform led probe! node is found! led-gpio num = 3 can't request led gpio! imx6ull-led: probe of gpioled failed with error -38通過打印的提示信息“can’t request led gpio!”可知第二次加載驅動時LED的GPIO已經被占用了,但是這期間又沒有其他的驅動加載使用到此IO,那就只有一個原因:上一次卸載驅動時沒有釋放LED的GPIO,導致系統還占用著,所以后面再加載驅動申請此IO時肯定就失敗了。
檢查程序,果然發現了在led_remove(struct platform_device *dev)函數體內部沒有調用gpio_free()函數釋放對應的GPIO,這一部分代碼補全后如下:
static int led_remove(struct platform_device *dev) {gpio_set_value(led.dev_gpio,1); // turn off the LEDgpio_free(led.dev_gpio);device_destroy(led.class,led.devid);class_destroy(led.class);cdev_del(&led.cdev);unregister_chrdev_region(led.devid,DTSPLATFORM_DEV_CNT);printk("dts platform led remove!\r\n");return 0; }所以測試驅動檢測bug的一個簡單方法:寫完一個驅動之后,反復的加載—卸載多次,如果沒有出現問題,就說明此驅動至少是可以運行,但不排除還有其他bug!!!
總結
以上是生活随笔為你收集整理的Linux驱动——驱动模块初次加载成功,后面失败 failed with error -38的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5轻松实现全屏视频背景
- 下一篇: linux的常用备份方法,Linux系统