OS是用 2015-11-21 Raspiban -jessie
linux kernel 是 4.1.15-v7+
按照範例.....把DHT11 掛上去
sudo insmod dht11km.ko gpio_pin=4 format=3
結果出現的message如下
check 了一下 dht11.c 檔...
應該是 request_mem_region 這邊要不到記憶體....
google 了一下
發覺很可能是GPIO_BASE 所使用的記憶體空間已經被使用...
使用指令查詢一下目前系統已經使用的記憶體空間
cat /proc/iomem
發覺 0x3f20_0000 已經有人用了
那為什麼GPIO_BASE 是從 0x3f20_0000開始呢?
參考這篇文章 http://sourceforge.net/p/raspberry-gpio-python/code/ci/default/tree/source/c_gpio.c#l132
#define BCM2709_PERI_BASE_DEFAULT 0x3f000000#define GPIO_BASE_OFFSET 0x200000
把兩個加起來就是 0x3f20_0000 ....(其實你也可以在driver code 裡面直接印出來看)
這邊解法就是反正那塊記憶體已經被人註冊使用.....就不需要自己註冊
就直接去使用就好...反正我們已經有實體的位置....
所以把原本的程式碼Mark掉
if (request_mem_region(GPIO_BASE, SZ_4K, DHT11_DRIVER_NAME) == NULL) {
printk(KERN_ERR DHT11_DRIVER_NAME ": unable to obtain GPIO I/O memory address\n");
return -EBUSY;
}
重開機....編譯.....載入
make
sudo insmod ./dht11km.ko gpio_pin=4 format=3
然後再掛上去節點
sudo mknod /dev/dht11 c 80 0
然後查詢他
cat /dev/dht11
得到的message 如下:
這一看就知道不對...... 一定是那裏有問題
打印一下message ...輸入
dmesg
google 了一下
http://silverfoxkkk.pixnet.net/blog/post/45000257-lddp%3A%E5%8D%81%E4%B8%80%E3%80%81%E4%B8%AD%E6%96%B7
從 /proc/interrupts 可以看到 IRQ 的狀態,最左邊的數值即是 IRQ 編號:
cat /proc/interrupts
輸入
cat /proc/interrupts
得到下面的訊息
看起來irq 49 已經被註冊了..... 3f200000.gpio:bank0
查一下已經安裝的 package list, 輸入
dpkg --get-selections | grep -v deinstall
目前看起來好像有沒甚麼特別的幫助......
後來查了一下書本 (LINUX 驅動程式 第10章)
他說在 request_irq(irq, irq_handler, flags, *dev_name, dev_id);
最常見的錯誤大概就是 -EBUSY.... 就是你要求的IRQ已經被其他驅動程式佔用了....
其中 構成flags 的各個位元,分述如下
SA_INTERRUPT : 表示此ISR是"快速型"..也就是能夠在中段失效期間執行完畢所有處理工
作的ISR
SA_SHIRQ : 此位元表示可以被不同裝置共享
SA_SAMPLE_RANDOM : ....
把原本的程式改成
result = request_irq(INTERRUPT_GPIO0, (irq_handler_t) irq_handler, IRQF_SHARED, DHT11_DRIVER_NAME, (void*)gpio);
但為什麼是 IROF_SHARED... 因為用SA_SHIRQ 會compile error....查了一下google 要改用 IROF_SHARED...
可以看到message 為 Interrupt 0031 obtained.....
這裡的數字是16進制...其實就是49 .....
不過從message 來看...還是有很奇怪的地方就是....他一直在free irq 49....
然後一直沒有產生中斷.........
後來才發現是我自己加了一段 free_irq的code.....
然後沒有收到中斷的原因是dht11 沒有反應....也就是沒有 rising 或是 falling edge 的變化
所以不會產生中斷....接下來就是需要示波器的出馬... 可惜我還沒有去買.....
==============================
2015/01/20
我一直寫信給賣我DHT11 module 的廠商...問他問題...結果他傳了一個網址給我
https://hackpad.com/KY-015-DHT11-29-fyNqEnzoZ5q
我一看....暈倒....完了....腳位不一樣....我往網路上查的是
(VDD , DATA, GND)
結果它們重新relayout成 (DATA,VDD,GND)
難怪不會動....氣死我了......
他們還提供一個在user space使用的範例
https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/blob/master/Adafruit_DHT_Driver/Adafruit_DHT.c
這個我之前也有試過....但是之前弄得時候不會動...才一直研究下去....
原來就是腳位弄錯......
把對的腳位弄上去....再跑一次....
終於有答案出來了...好高興....
但溫度好像怪怪的.......
再多讀幾次就ok.....
感覺像是bit有被offset到.....可能要等到示波器來會比較知道what happen...
Reference : https://www.raspberrypi.org/forums/viewtopic.php?t=110737&p=799913
Reference : Low Level Programming of the Raspberry Pi in C
請問有可以參考的source code嗎
回覆刪除