12 orangepi Linux裝置驅動前言

2021-08-02 03:35:34 字數 1686 閱讀 3024

需要了解的知識:

1). 驅動是硬體與使用者程序之間的通訊橋梁

使用者程序是不可以直接訪問硬體的.

如:hexdump /dev/input/event4 //這樣,程式hexdump從裝置檔案裡接收資料並按十六進製制列印出來

資料是驅動先接收到硬體反饋的資料處理後再移交給使用者程序

驅動不屬於任何乙個使用者程序, 可以給多個使用者程序呼叫.

驅動是常駐於記憶體裡,等待使用者程序呼叫.

2). 使用者程序如訪問越界則會發生段錯誤,但對其它程序沒有影響. 使用者程序在cpu的usr模式下工作

驅動是在svc模式下工作(特權模式), 驅動發生錯誤,會影響整個系統(像windows系統藍屏).

寫應用程式有bug僅僅是影響該程序,但寫驅動時,哈哈…

3). 驅動載入到核心後(即驅動工作), 除了初始化工作以外,一般情況下是不會自動去執行操作的,

驅動是被使用者程序呼叫才會觸發操作的. 所以也得注意驅動的介面函式的可重入性

也就是驅動是實現硬體的各種功能,但怎麼去使用由使用者程序呼叫來決定

4). 驅動要注意可移植性. 驅動裡用的棧是定長(8k), 所以在使用大的緩衝區時需要動態申請(kmalloc/vmalloc)

5). c庫函式不能在核心驅動裡呼叫, 因c庫需要通過系統呼叫來實現功能.

但在核心裡有實現大部分c庫的基本功能函式,如核心裡的printk可代替c的printf函式

cat /proc/kallsyms | grep 函式名 //可檢視當前核心裡是否有提供此功能函式

6). 核心使用物件導向的做法來實現裝置驅動方法的. 如用struct cdev的乙個變數來描述乙個字元裝置驅動.

先了解所用的結構是描述是什麼的,然後才看具體的做法

核心原始碼的目錄:

arch

arm

mach-sunxi : 每個cpu型號都會有mach-***x的目錄, 此目錄裡會有幾個c檔案,這些檔案表示基於這個cpu所做的方案, 原始碼裡大多是用於描述此方案的硬體資源(如: sun4i.c , sun6i.c, sun8i.c…)

block : 實現塊裝置的介面與管理,大容量的儲存裝置(sd, nand, emmc)

cypto: 加密演算法

documentation: 文件

drivers: 硬體的驅動

firmware: 韌體, 提供給外接晶元啟動時載入的程式,如wifi模組(zd1211)

fs: 檔案系統格式

init: 核心啟動時初始化的**

ipc: 程序間通訊的實現功能**

kernel: 裡面實現程序排程的功能

mm: 記憶體管理

net: 網路協議棧的實現

scripts: 配置核心make menuconfig時產生介面的指令碼

sound: 音效卡驅動相關

// 核心起用介面標準化的作用.即核心裡制定了驅動的介面及應用程式的呼叫介面. 只要雙方都遵循標準的介面,雙方就可以實現通訊,而不用管具體一方是什麼樣,怎樣實現的。 達到分層編碼實現的效果.

driver_inteface  <--->   (linux kernel)   <--->  api
如應用程式是按乙個標準的介面去接收觸控螢幕的資料,

而不同的觸控螢幕驅動也是按乙個標準的驅動介面把資料提交給核心, 核心再按應用層的

標準的介面把資料轉交給應用程式

12月12日作業

第二道 package 作業第二道 3 設計四個類,分別如下 必做題 設計shape表示圖形類,有面積屬性area 周長屬性per,顏色屬性color,有兩個構造方法 乙個是預設的 乙個是為顏色賦值的 還有3個抽象方法,分別是 getarea計算面積 getper計算周長 showall輸出所有資訊...

12月12日感悟續

寫完dty和auta,後面我再寫一些目前自己的工作和生活方面的事情。花了大概有1個月在看 高效人士的七種習慣 了,基本上對個人的部分看的差不多了吧,個人的三個習慣分別是 1.人擁有創造自己生活的能力 2.人應該先構思出自己想要的生活 3.人可以高效管理好自己的生活 目前我的想法是 我已經明白了第一點...

第12周 專案1(2)

問題及 檔名稱 main.cpp 作 者 賈慶嚴 完成日期 2016年6月15日 版 本 號 v1.0 問題描述 用類的成員函式,定義複數類過載運算子 使之能用於複數的加減乘除 include using namespace std class complex complex double r,do...