1. 程式人生 > >Linux裝置驅動之《字元裝置驅動》

Linux裝置驅動之《字元裝置驅動》

    Linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是一個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open(),close(),read(),write()等。

    下面是一個字元裝置驅動程式的簡單實現test.c

   

    模組分析

    1.初始化裝置驅動的結構體

    struct file_operations test_fops = {
    .owner=THIS_MODULE,
    .read=read_test,
    .write=write_test,
    .open=open_test,
    .release=release_test,
    };

    定義了裝置IO時所呼叫的函式,實際上在該模組中,上層read呼叫的就是底層的read_test,write呼叫write_test,open呼叫open_test,close呼叫release_test 。

    2.module_init函式

    int simple_c_init_module(void)
{
    int result;
    dev_t dev = 0;
   
    dev=MKDEV(test_major,test_minor);
    result = register_chrdev_region(dev,1,"test");
   
    printk("major= %d,minor=%d /n",test_major,test_minor);
   
    if(result < 0)
    {
        printk(KERN_INFO "test : can't get major number/n");
        return result;
    }
   
    cdev_init(&cdevc,&test_fops);
    cdevc.owner= THIS_MODULE;
    cdevc.ops=&test_fops;
    result=cdev_add(&cdevc,dev,1);
    if(result)
        printk("Error %d adding test",result);
    return 0;
}

    (1)首先MKDEV一個裝置,test_major和test_minor分別定義在檔案的前面

    unsigned int test_major=253;
    unsigned int test_minor=0;

    (2)然後註冊一個範圍內的裝置編號,

    result = register_chrdev_region(dev,1,"test");

    該函式原型是

      

    三個引數分別表示:第一次在預期的範圍內的裝置編號,連續數的裝置所需數量,這個名字的裝置或驅動程式。

    (3)printk在核心中類似printf函式,打印出兩個裝置號。

    (4)初始化字元裝置結構體cdev_init(&cdevc,&test_fops);
   兩個引數分別表示:這個結構的初始化,本裝置的file_operations,

      函式的功能是:記住fops cdev初始化,使之可以新增到系統和cdev_add。

    (5)為字元裝置的結構cdevc賦值


    (6)呼叫int cdev_add ( struct cdev *p,  dev_t  dev,   unsigned   count);

     作用:cdev_add 將p結構體加入到系統的裝置,使其立即生效。 一個負的錯誤程式碼返回失敗。

    3.module_exit();函式

void simple_c_cleanup_module(void)
{
    dev_t dev=0;
    dev = MKDEV(test_major,test_minor);
    cdev_del(&cdevc);
    unregister_chrdev_region(dev,1);
}

    函式 cdev_del —從系統中移除一個字元裝置

    函式 unregister_chrdev_region 返回的裝置數字範圍

    4.底層函式設計

   

    演示:

    編譯,make(Makefile參見http://blog.csdn.net/wanxiao009/archive/2010/06/13/5669665.aspx)

    生成test.ko

    minicom登入開發板,

    傳送到開發板中,

    chmod +x test.ko

    建立裝置節點 mknod /dev/test c 253 0(253 0 就是test_major,test_minor)

    insmod test.ko

    如下圖所示

   

    說明字元驅動可以成功新增到核心模組中 ^_^!

相關推薦

Linux驅動字元裝置工作原理(未完)

字元裝置驅動工作原理 系統整體工作原理 應用層->API->裝置驅動->硬體? API:open、read、write、close等? 驅動原始碼中提供真正的open、read、write、close等函式實體? file_

linux驅動字元裝置

第一部分:字元裝置工作過程1、系統呼叫和驅動程式的關聯關鍵結構體:struct file_operation;file_operation結構體的每一個成員的名字都對應著一個系統呼叫。使用者程序利用系統呼叫在對裝置檔案進行諸如read/write操作時,系統呼叫通過裝置檔案的主裝置號找到相應的裝置驅動程式,然

Linux裝置驅動字元裝置驅動---轉

一、linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。 應用程式呼叫的流程框圖: 三種裝置的定義分別如下, 字元裝置:只能一個位元組一個位元組的讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後順序進行。字元裝置是面向流的裝置,常見的字

Linux裝置驅動字元裝置(一)

Linux中裝置驅動的分類 從上圖可以看到Linux系統將各異的裝置分為三大類:字元裝置,塊裝置和網路裝置。核心針對每一類裝置都提供了對應驅動模型架構,包括基本的核心設施和檔案系統介面。 字元裝置:在傳送過程中以字元為單位,一個位元組一個位元組的讀寫,不

Linux裝置驅動字元裝置驅動

一、linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。 應用程式呼叫的流程框圖: 三種裝置的定義分別如下, 字元裝置:只能一個位元組一個位元組的讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後順序進行。字元裝置是面向流的裝置,常見的字元裝置如

linux驅動字元裝置驅動

字元裝置驅動框架: cdev結構體: 描述字元裝置; dev_t:定義裝置號(分為主、次裝置號)以確定字元裝置的唯一性; file_operations:定義字元裝置驅動提供給VFS的介面函式,如常見的open()、read()、write()等;

深入淺出:Linux裝置驅動字元裝置驅動

一、linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。使用驅動程式: 字元裝置:是指只能一個位元組一個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。字元裝置是面向流的裝置,常見的字元裝置有滑鼠、鍵盤、串列埠、

I2C裝置驅動字元裝置簡寫

最近有機會需要寫一個 掛載在I2C匯流排的I2C裝置驅動,外設晶片是MCP23017 IO擴充套件晶片,測試是否可以通訊成功,以下是部分程式碼以及除錯的一些注意項: #include <linux/kernel.h> #include <linux/init.h>

linux driver ------ 字元裝置驅動“ 建立裝置節點流程 ”

在字元裝置驅動開發的入門教程中,最常見的就是用device_create()函式來建立裝置節點了,但是在之後閱讀核心原始碼的過程中卻很少見device_create()的蹤影了,取而代之的是device_register()與device_add(),將device_create()函式展開不難發現:其實de

Linux裝置驅動mmap裝置操作(memdev.c字元裝置驅動分析)

from:  1.mmap系統呼叫 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 功能:負責把檔案內容對映到程序的虛擬地址空間,通過對這段記憶體的

Linux字元裝置驅動模型--字元裝置的註冊

當我們編寫字元裝置驅動程式的時候,在進行字元裝置物件cdev的分配、初始化,裝置號的註冊這些初始化階段之後,就可以將它加入到系統中,這樣才能使用這個字元裝置。將一個字元裝置加入到系統中呼叫的函式時cdev_add,核心原始碼如下: int cdev_add(struct cdev *

Linux 驅動裝置結構體 (二)

上回最後面介紹了相關資料結構,下面再詳細介紹 塊裝置物件結構 block_device 核心用結構block_device例項代表一個塊裝置物件,如:整個硬碟或特定分割槽。如果該結構代表一個分割槽,則其成員bd_part指向裝置的分割槽結構。如果該結構代表裝置,則其成員

linux powerpc i2c驅動  i2c裝置

pr_debug("bus: '%s': %s: bound device %s to driver %s\n", drv->bus->name, __func__, dev_name(dev), drv->name);  

Linux應用程式訪問字元裝置驅動詳細過程解析

下面先通過一個編寫好的核心驅動模組來體驗以下字元裝置驅動 可以暫時先忽略下面的程式碼實現! memdev.c #include <linux/module.h> #include <linux/fs.h> #include <linux/in

Linux裝置模型tty&&uart驅動架構分析

五: uart_add_one_port()操作 在前面提到.在對uart裝置檔案過程中.會將操作轉換到對應的port上,這個port跟uart_driver是怎麼關聯起來的呢?這就是uart_add_ont_port()的主要工作了. 顧名思義,這個函式是在uart_driver增加一個port.程式碼如

Linux裝置驅動button按鍵驅動學習與小結

button按鍵驅動,相對於前面的LED驅動來說。增加了中斷處理以及阻塞與非阻塞方式等新知識點。 先上學習的驅動程式碼。 核心:linux3.0 板子:fl2440 /***************************************************

第16章 驅動開發字元裝置驅動程式框架

16.1 字元裝置驅動程式框架簡介 我們在學習 C 語言的時候,知道每個應用程式的入口函式,即第一個被執行的函式是 main函式,那麼,我們自己的驅動程式,哪個函式是入口函式呢? 在寫驅動程式的時候,如果函式的名字可以任意取,常常為 xxxx_init(),

Linux核心模組程式設計-字元裝置驅動

裝置驅動簡介 裝置被大概的分為兩類: 字元裝置和塊裝置。 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,鍵盤、串列埠、調變解調器都是典型的字元裝置。 塊裝置 應用程式可以隨機

linux驅動裝置驅動

塊裝置驅動的系統架構 VFS: 是對各種具體檔案系統的一種封裝,使用者程式訪問檔案提供統一的介面。例如: EXT2,FAT,NFS等 系統架構—Cache: 當用戶發起檔案訪問請求的時候,首先回到Cache中定址檔案是否被快取了,如果在Ca

Linux裝置驅動USB hub驅動(續)

5.2.2:介面驅動中的hub_thread()函式 我們之前在分析usb_hub_init()的程式碼的時候,忽略掉了一部份. 程式碼片段如下所示: int usb_hub_init(void) {    ……     khubd_task = kthread_run(hub_thread, NULL, "