Time of Update: 2018-12-03
在整個usb-storage模組的代碼中,其最靈魂的部分在一個叫做usb_stor_control_thread()的函數中,而那也自然是我們整個故事的高潮。這個函數的調用有一些特殊,是從usb_stor_acquire_resources()函數進入的,而後者我們即將遇到,它在整部戲中只出現過一次,即storage_probe中,行號為1005的地方。然而在此之前,有四個函數擋在我們面前,它們就是get_device_info,get_transport,get_protocol,get_pi
Time of Update: 2018-12-03
先行編譯指令#pragma的用法最近在看開源項目中的代碼時,發現許多地方都用到了#pragma的程式。因此,就問了下Google老師,總結了下#pragma先行編譯指令的常用用法,現在和大家分享下。一.#pragma最常用的方法1. #progma pack(n)1>功能:使用#progma
Time of Update: 2018-12-03
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_
Time of Update: 2018-12-03
linux驅動子系統之輸入子系統(4)4.事件處理層4.1 概述事件處理層負責和應用程式層介面,建立裝置節點和相關的檔案系統檔案,把事件資訊上報給應用程式層。每種事件處理層驅動程式都是實現了一個file_operations,當應用調用open,write,read等系統調用訪問輸入裝置檔案時,就會調用到file_operations中的方法。4.2 資料結構和函數l Input_handler,用來描述一個輸入裝置處理器,struct input_handler {
Time of Update: 2018-12-03
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=
Time of Update: 2018-12-03
4.小結4.1 kobject, kset和ktypekobject, kset和ktype就三個結構體,但是卻很容易讓人混淆,是由於它們內部相互交織。l kobject,是裝置模型中的基本對象,包含了引用計數,父子關係,目錄項等,通常會嵌入到其它的資料結構中,使其也具有kobject的特性;l ktype,定義了一些kobjct相關的預設特性:解構函式,sysfs操作以及預設屬性;l kset,實現兩個功能:n 其中嵌入的kobject作為kobject組的基類n
Time of Update: 2018-12-03
linux驅動子系統之輸入子系統(5)5. 總結5.1 事件資訊的上報過程分析l 上報的大致過程:裝置驅動層->核心層->事件處理層->應用程式層l 具體調用的函數(以evdev為例):input_event()->input_handle_event() ->input_pass_event() ->handle->handler->event(handle,type, code, value) ->evdev_event()
Time of Update: 2018-12-03
從兩張表得到了我們需要的東西,然後下面的代碼就是圍繞著這兩個指標來展開了。(unusual_dev和id)繼續看get_device_info()。497行,把unusual_dev給記錄在us裡面,反正us裡面也有這麼一個成員。這樣記錄下來以後使用起來就方便了,因為us是貫穿整個故事的,所以訪問它的成員很方便,隨時都可以,但是us_unusual_dev_list以及storage_usb_ids這兩張表這次之後就不會再用了。因為我們已經得到了我們想要的,所以就不用再去騷擾這兩個數組了。498
Time of Update: 2018-12-03
linux驅動子系統之輸入子系統(3)3.裝置驅動層3.1 概述負責與底層輸入裝置通訊,實現具體硬體裝置驅動,擷取硬體產生的事件資訊報給上層。本層是要我們實現的,核心也提供了很多裝置驅動。 3.2 資料結構和函數l input_dev,子系統中用此結構體來描述一個輸入裝置struct input_dev{ /* 匯出到使用者空間的相關資訊,在sys檔案可以看到*/ const char *name; const char *phys;
Time of Update: 2018-12-03
Linux驅動之觸控螢幕(4)-多點觸控4.1 概述 此驅動支援it7260觸控螢幕控制器,最多支援三點觸摸,已在CPU: s5pc110、linux-2.6.32.9、android-2.2上測試通過。原本以為三天就能搞定,最後還是用了一個禮拜才弄完。水平有限,可能存在一些bug,請及時反饋給我(cjok.liao@gmail.com)。 觸控螢幕驅動主要分為兩個部分: I2C驅動部分:主要負責將裝置掛接到I2C匯流排上,實現資料轉送;
Time of Update: 2018-12-03
3.ktype& Kset3.1 ktypel 用來描述一組kobject所具有的共同特性,用structkobj_type結構體來表示struct kobj_type{ void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; const struct kobj_
Time of Update: 2018-12-03
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
Time of Update: 2018-12-03
8.類8.1 classl Class是對裝置按照功能進行的分類,這樣做是為了給使用者空間提供一個比較友好的介面。Class也是一個kset,對應於/sys/class下的一個目錄int __initclasses_init(void){ /* 對應/sys/class目錄 */ class_kset =kset_create_and_add("class", NULL, NULL); if (!class_kset)
Time of Update: 2018-12-03
1. 裝置,LDM中用device結構體來描述裝置struct device { /* 父裝置,通常是某種匯流排或者是宿主裝置 */ struct device *parent; /* 私人資料指標:子裝置鏈表,父裝置鏈表節點,驅動程式鏈表節點,匯流排鏈表節點 */ struct device_private *p; struct kobject kobj; /*
Time of Update: 2018-12-03
linux驅動子系統之輸入子系統(1)1.輸入子系統架構1.1 概述核心提供的輸入子系統是對分散的、多種不同類別的輸入裝置(鍵盤、滑鼠、觸控螢幕、加速計、跟蹤球、操縱杆等)進行統一處理的驅動程式。 輸入子系統帶來的好處:l 抽象底層形態各異的硬體輸入裝置,為上層提供了統一的操作介面 l 提高了代碼重用率和效率,減少了bug 1.2 系統架構輸入子系統的三層結構:l 事件驅動層 負責和應用程式的介面 l 核心層
Time of Update: 2018-12-03
1. 硬體原理1.1overview 我們常用的觸控螢幕類型有兩種:阻性觸控螢幕和容性觸控螢幕。它們在硬體上相差比較大,在驅動實現上相對來說差別比較小。容性觸控螢幕支援多點觸控螢幕,使用者體驗上比較好。下面將簡單介紹一下觸控螢幕用到的硬體原理。 1.2ADC轉換 AD轉換的作用是將時間連續、幅值也連續的類比量轉換為時間離散、幅值也離散的數字訊號。 1.3 阻性觸控螢幕l 簡單來說,阻性觸控螢幕是一種感應器,它將矩形地區中觸摸點(X,
Time of Update: 2018-12-03
1. 裝置驅動,在Linux裝置模型中,裝置驅動用device_driver結構來表示struct device_driver { const char *name; /*名字*/ struct bus_type *bus; /* 附屬的匯流排 */ struct module *owner; const struct
Time of Update: 2018-12-03
2. 觸控螢幕驅動分析2.1overview 觸控螢幕驅動並沒有阻性和容性之分,只有單點觸摸和多點觸摸之分。典型的觸控螢幕驅動都會基於輸入子系統來做。這裡先來分析一下s3c2410_ts.c(舊核心裡是s3c_ts.c,相對來說變動很大,有興趣可以去看看)這個驅動檔案。此檔案名稱字雖然是s3c2410,但是同樣也支援s3c2440和s3c6410。 2.2
Time of Update: 2018-12-03
結束了get_device_info,我們繼續沿著storage_probe一步一步地走下去。繼續,這就是我們前面提到過的三個函數,get_transport、get_protocol和get_pipes。一旦結束了這三個函數,我們就將進入本故事的高潮部分。而在這之前,我們只能一個一個地來看。好在這幾個函數雖然不短,但是真正有用的資訊只有一點,所以可以很快看完。993 /* Get the transport, protocol,and pipe settings */994
Time of Update: 2018-12-03
3. 多點觸摸3.1overview 多點觸摸沒啥好特別的,就是把多個單點捆綁起來,組合成一組座標值。然後上層應用對其手勢進行解析,就有了我們平常看到的兩個手指對圖片進行縮放等功能。從Linux-2.6.30才對多點觸摸支援。 3.2 單點觸摸和多點觸摸l 單點觸摸和多點觸摸都是基於輸入子系統來做,所以對於在軟體上的實現區別不是很大。 l 參數設定單點觸摸:Input_dev->evbit[0]= BIT_MASK(EV_KEY) |