V4L2 driver Step by Step

.甚麼是V4L2 ?
  V4L2 全名為 Video For Linux Version 2,是 Linux 對於視訊擷取相關設備所建立的框架(Framework),此框架為驅動程式及應用程式提供了一套統一的接口規範。

  其支援的設備很多,不單只有視訊擷取設備,更可能包括: camera,video decoder, video encoder,tunner, ir remote, etc.
  列舉如下:
  .Video capture device- camera sensor, 裝置名稱為 /dev/video0~63 ,其 major number 為 81,minor number為0~63.
  .Video output device- 視訊數據編碼,裝置名稱為 /dev/video0~63.
  .Video overlay device- 一種圖形介面卡能將 TV訊號轉為VGA訊號,或是一種圖形介面卡能將擷取的影像直接存到視訊記憶體中。
  .Video output overlay device-OS-Screen Display(OSD)。
  .VBI device-提供對 Vertical Blanking Interval的控制. 裝置名稱為 /dev/vbi0~31.其 major number 為 81,minor number為224~255.
  .Radio device- FM/AM廣播設備,設備名稱為 /dev/radio0~63,其 major number 為 81,minor number為64~127.
 
.從檔案系統來看
  通常一個有成功註冊的 V4L2 Driver會在檔案系統中/dev註冊一個字元型設備如: video0, video1 (實際要根據你的平台總共註冊了多少個)。
  下面的範例為一個camera V4L2 dirver,所註冊的設備名稱為/dev/video0,類行為字元型設備,其 major number 為 81,minor number為0。
  --
  mark@R3600:/dev$ ll -l video0
  crw-rw----+ 1 root video 81, 0 Oct 21 10:21 video0
  --
  應用程式可以經由open此設備名稱 /dev/video0,進行 ioctl 對設備進行操作,如下達VIDIOC_QUERYCAP 來訊問設備的capability。
 
.撰寫一個簡單的 V4L2 driver
  為了要了解整個V4L2 driver的架構及撰寫方式,以下將採用循循漸進的方式,一步一步將一個完整的V4L2建構起來。
  並撰寫一個簡單的應用程式來對V4L2 driver做存取,進而更了解整個運作流程。
  因linux kernel近年來改版快速,在這邊先說明一下我的測試環境:
  ---
  OS:Ubuntu 1204
  Kernel version: 3.2.0-90-generic
  ---
 
.步驟一:暖身,建立一個driver(module)架構:
   linux下的驅動程式有一個基本的架構,我們先把他建立起來,並撰寫一個Makefile來編譯module,並嘗試把此driver load到kernel裡。
   一個簡單的driver 架構如下,此檔案請先命名為 (v4l2step1.c):
   --v4l2step1.c---   
      #include <linux/module.h>
        
      static int __init vivi_init(void)
      {      
            
        printk(KERN_INFO "[mark]%s, %d, module inserted\n", __func__,__LINE__);
        return 0;  
      }  
        
      static void __exit vivi_exit(void)
      {  
          printk(KERN_INFO "[mark]%s, %d, module remove\n", __func__,__LINE__);
      }  
        
      module_init(vivi_init);
      module_exit(vivi_exit);
        
      MODULE_DESCRIPTION("Mark test module");
      MODULE_AUTHOR("Mark Yang");
      MODULE_LICENSE("GPL");  
  -----------------
  簡單說明如下:
  當一個 module ko檔案被insmod時,會呼叫module_init,進入到 vivi_init 函式,目前是印出訊息
  當一個module ko檔案被 rmmod 時,會呼叫module_exit,進入到 vivi_exit 函式,目前是印出訊息
 
  為了要make dirver為.ko檔案,必須有一個 Makefile 檔案,內容如下:
  --Makefile--
    #
    # Makefile for kernel test
    #
    PWD         := $(shell pwd)
    KVERSION    := $(shell uname -r)
    KERNEL_DIR   = /usr/src/linux-headers-$(KVERSION)/
    
    MODULE_NAME  = v4l2step1
    obj-m       := $(MODULE_NAME).o   
    
    all:
        make -C $(KERNEL_DIR) M=$(PWD) modules
    clean:
        make -C $(KERNEL_DIR) M=$(PWD) clean
      
  ------------
  簡單說明如下:
  只要根據不同的driver .c檔名,修改MODULE_NAME  = v4l2step1 即可
 
  好,現在driver有了,Makefile也有了,將兩個檔案放在同目錄下,執行 make 指令應該可以build出 v4l2step1.ko
  如果有出現Permission denied訊息,請注意一下你的檔案權限,請將目錄或檔案權限改為 777。
 
  接下來就是要將 driver load起來,可以先用 lsmod看看目前有哪些 driver 有被load起來。
  可以發現,並沒有 v4l2step1 這支driver。
  現在我們要將 v4l2step1.ko load起來,利用 sudo insmod v4l2step1.ko 指令將 drvier load起來後
  再次用lsmod檢查看看,應該要有v4l2step1,如下:
  --lsmod----
    mark@R3600:~/v4l2/step1$ lsmod
    Module                  Size  Used by
    v4l2step1              12502  0
    vivi                   13069  0
    videodev               98259  1 vivi
    v4l2_compat_ioctl32    17128  1 videodev
    snd_hda_codec_hdmi     32530  1   
  ------
  也可以利用 dmesg 看看是否有 vivi_init 所吐出的訊息。
  ---dmesg---
  ...
  [78449.338187] [mark]vivi_init, 14, module inserted
  ------
 
  想要移除 v4l2step1 ,可以輸入指令  sudo rmmod v4l2step1,同樣的你可以用 lsmod 看看是否真的移除,且利用 dmesg 看看是否有訊息。
 

arrow
arrow
    文章標籤
    v4l2
    全站熱搜
    創作者介紹
    創作者 CuteParrot 的頭像
    CuteParrot

    馴龍窩

    CuteParrot 發表在 痞客邦 留言(0) 人氣()