2016年1月14日 星期四

DHT11 實作 on Raspberry

我的硬體是 RPI2

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



大概也是這個message .....

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

1 則留言: