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, "