從協議中來,到協議中去(上)在structusb_driver中,.probe和.disconnect的原型如下:836 int(*probe) (struct usb_interface *intf,837 const struct usb_device_id *id);838839 void(*disconnect) (struct usb_interface
# Makefile 2.4KDIR=/lib/modules/$(shell uname -r)/buildOBJS=mymodule.oCFLAGS=-D__KERNEL__ -I$(KDIR)/include -DMODULE -D_KERNEL_SYSCALLS__ -DEXPORT_SYMTAB -O2 -fomit-frame-pointer -Wall -DMODVERSIONS -include
一、中斷類: 1. 中斷類型: 在request_irq(irq, handler, flags, devname, dev_id)中使用 #define SA_SHIRQ 共用中斷(舊版本的,2.6.19之前的核心) #define IRQF_SHARED 共用中斷(新版本的) #define SA_INTERRUPT 快速中斷(舊版本的) #define IRQF_DISABLED
probe,disconnect,id_table,這三個元素中首先要登場亮相的是id_table,它是幹什麼用的呢?我們說過,一個裝置只能綁定一個驅動,但驅動並非只能支援一種裝置。道理很簡單,比如我有兩塊隨身碟,那麼我可以一起都插入,但是我只需要載入一個模組,usb-storage。沒聽說過插入兩塊隨身碟就得載入兩次驅動程式的,除非這兩塊隨身碟本身就得使用不同的驅動程式。也正是因為一個模組可以被多個裝置共用,才會有“模組計數”這個說法。既然一個驅動可以支援多個裝置,那麼當發現一個裝置時,如何知
核心中每個字元裝置都對應一個 cdev 結構的變數,下面是它的定義:linux-2.6.22/include/linux/cdev.hstruct cdev { struct kobject kobj; // 每個 cdev 都是一個 kobject struct module *owner; // 指向實現驅動的模組 const struct file_operations *ops; // 操縱這個字元裝置檔案的方法 struct list_
bus上的兩張鏈表記錄了每一個裝置和驅動,那麼裝置和驅動這兩者之間又是如何聯絡起來的呢?此刻,必須拋出這樣一個問題,先有裝置還是先有驅動?在以前,先有的是裝置,每一個要用的裝置在電腦啟動之前就已經插好了,插放在它應該在的位置上,然後電腦啟動,然後作業系統開始初始化,匯流排開始掃描裝置。每找到一個裝置,就為其申請一個struct device結構,並且掛入匯流排中的devices鏈表中來,然後每一個驅動程式開始初始化,開始註冊其struct
Linux進程學習之exit()和_exit()函數 進程就好比人一樣有其生命,我們通過fork()函數來建立一個進程,那麼我們又是如何來中止進程呢。 進程退出 1.在Linux中任何讓一個進程退出 進程退出表示進程即將結束。在Linux中進程退出分為了正常退出和異常退出兩種。 1>正常退出 a.
現在很多人的系統是windows xp的.考慮到最近linux很火.呵呵.所以眾菜鳥們躍躍欲試..拿起武器開始操刀..想讓xp和linux共存.殊不知習慣了windows一路next的朋友們,面對linux可不能一路next了... 今天幫同學在他電腦上裝linux.由於沒有系統硬碟.所以就網上自己下載的iso鏡像檔案.呵呵.本人本著能省則省的原則,還是到網上下了個鏡像檔案.
linux系統提供了input子系統,按鍵、觸控螢幕、鍵盤、滑鼠等輸入裝置都可以利用input介面函數來實現裝置驅動。在linux核心中,input裝置用input_dev結構體描述,試用input子系統實現輸入裝置驅動的時候,驅動的核心工作是向系統報告按鍵、觸控螢幕、鍵盤、滑鼠等輸入事件(event,通過input_event結構體描述),不再需要關心檔案操作介面,因為input子系統已經完成了檔案操作介面。驅動報告的事件經過InputCore和Eventhandler最終到達使用者空間。通過
對於整個usb-storage模組,usb_stor_init()函數是它的開始,然而,對於隨身碟驅動程式來說,它真正驅使隨身碟工作卻是始於storage_probe()函數。兩條平行線只要相交,就註定開始糾纏一生,不管中間是否短暫分離。USB
storage_probe這個函數挺有意思,總長度不足100行,但是幹了許多事情,這就像足球場上的後腰,比如切爾西的馬克萊萊,在場上並不起眼,但是卻為整個團隊做出了卓越的貢獻。我們繼續看storage_probe的代碼:972 mutex_init(&(us->dev_mutex));973 init_MUTEX_LOCKED(&(us->sema));974 init_completion(&(us->notify));975
羅馬不是一天建成的。在讓隨身碟工作之前,其實我們的驅動做了很多準備工作。我們繼續跟著感覺走,storage_probe(),972行至975行,一系列的以init_*命名的函數在此刻被調用,這裡涉及了一些鎖機制,等待機制,不過只是初始化,暫且不理睬,到後面用到時再細說,不過請記住,這幾行每一行都是有用的。後面自然會用得著。此時,我們先往下走,978行的associate_dev()和989行的get_device_info(),這兩個函數是我們目前需要看的。先看associate_dev()函數
在整個usb-storage模組的代碼中,其最靈魂的部分在一個叫做usb_stor_control_thread()的函數中,而那也自然是我們整個故事的高潮。這個函數的調用有一些特殊,是從usb_stor_acquire_resources()函數進入的,而後者我們即將遇到,它在整部戲中只出現過一次,即storage_probe中,行號為1005的地方。然而在此之前,有四個函數擋在我們面前,它們就是get_device_info,get_transport,get_protocol,get_pi
6 總結根據之前的分析豐富的架構圖Tips:I2C適配器驅動不一定是基於platform實現,這裡是以s3c-i2c為例。 I2c_driver、i2c_client與i2c_adapterI2c_driver與i2c_client是一對多的關係,一個i2c_driver上可以支援多個同等類型的i2c_client。調用i2c_add_driver函數將I2c_driver註冊到I2C匯流排上,調用i2c_register_board_info函數將i2c_client註冊到全域鏈表__i2c_
linux驅動子系統之輸入子系統(4)4.事件處理層4.1 概述事件處理層負責和應用程式層介面,建立裝置節點和相關的檔案系統檔案,把事件資訊上報給應用程式層。每種事件處理層驅動程式都是實現了一個file_operations,當應用調用open,write,read等系統調用訪問輸入裝置檔案時,就會調用到file_operations中的方法。4.2 資料結構和函數l Input_handler,用來描述一個輸入裝置處理器,struct input_handler {
linux驅動子系統之輸入子系統(2)2. 輸入核心層2.1 概述核心層對下提供了裝置驅動層的編程介面,對上有提供了事件處理層的編程介面。input.c是核心層實現的檔案。 2.2 驅動程式碼分析l 初始化模組static int __init input_init(void){ err= class_register(&input_class); err= input_proc_init(); err=
linux驅動子系統之輸入子系統(3)3.裝置驅動層3.1 概述負責與底層輸入裝置通訊,實現具體硬體裝置驅動,擷取硬體產生的事件資訊報給上層。本層是要我們實現的,核心也提供了很多裝置驅動。 3.2 資料結構和函數l input_dev,子系統中用此結構體來描述一個輸入裝置struct input_dev{ /* 匯出到使用者空間的相關資訊,在sys檔案可以看到*/ const char *name; const char *phys;
1 匯流排 匯流排,是處理器與一個或者多個裝置之間的通道。在Linux裝置模型中,所有的裝置都通過匯流排相連,甚至是那些內部的虛擬"platform"匯流排。用bus_type結構來描述。 struct bus_type {const char*name; /* 匯流排名 */const char*dev_name; struct device*dev_root;struct bus_attribute*bus_attrs; /* 匯流排屬性 */struct
1. 裝置,LDM中用device結構體來描述裝置struct device { /* 父裝置,通常是某種匯流排或者是宿主裝置 */ struct device *parent; /* 私人資料指標:子裝置鏈表,父裝置鏈表節點,驅動程式鏈表節點,匯流排鏈表節點 */ struct device_private *p; struct kobject kobj; /*
1. 裝置驅動,在Linux裝置模型中,裝置驅動用device_driver結構來表示struct device_driver { const char *name; /*名字*/ struct bus_type *bus; /* 附屬的匯流排 */ struct module *owner; const struct