PIXNET Logo登入

電腦購物天堂

跳到主文

各種商品資訊

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 5月 13 週五 201116:30
  • [linux]device

在 Linux 中,所有的設備都是一個檔案,每個檔案都有自己特殊的編號和型態,我們可以在 /dev 中找到目前系統所有的 device
,這些 device 不一定是實際存在的硬體,也有可能是以虛擬的方式掛載上去的。例如,如果想要了解目前系統中總共有多少的 SATA
硬碟以及分割區,可以在終端機下鍵入:
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(97)

  • 個人分類:LINUX
▲top
  • 5月 13 週五 201116:04
  • [linux]依流程來實作 -- Physical Device Driver

作者/陳俊宏
www.jollen.org
I/O 存取的觀念
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(507)

  • 個人分類:LINUX
▲top
  • 5月 13 週五 201115:35
  • [linux]依流程來實作 -- Virtual Device Driver




根據Linux驅動程式的一般化設計流程,我們來設計一個真正可以動的驅動程式。


作者/陳俊宏
www.jollen.org


根據流程寫程式


定義 file_operations



struct file_operations card_fops = 
{
open: card_open,
write: card_write,
release: card_release,
ioctl: card_ioctl,

};


由此定義可以,我們所計的驅動程式將提供 open/write/close(release)/ioctl 4 個 system call 介面給 user application。


實作 System Call


接著要實作我們所提供的4個 system call。open/close(即 release)/read/write/ ioctl 是初學
Linux 驅動程式最重要的 5 個 system call,了解如何實作不同的 system call,是學好 Linux
驅動程式的重要工作。


本文先介紹 open/close(release)/write 的實作。此部份說明如後。


註冊 Driver


將driver自己「註冊」到kernel的VFS層,註冊時所要呼叫的函數根據裝置類型的不同而不同。


將驅動程式「註冊」(registration)至kernel的動作必須在init_module()函數裡實作。根據裝置類型的不同,所呼叫的函數也不同,以下是幾個基本的裝置註冊函數:



˙ int register_chrdev(unsigned int major, const char * name, struct
file_operations *fops):註冊字元型驅動程式。
˙ int register_blkdev(unsigned int major, const char *name, struct
file_operations *fops):註冊區塊型驅動程式。
˙ int usb_register(struct usb_driver *new_driver):註冊USB驅動程式。
˙ int pci_register_driver(struct pci_driver *):註冊PCI驅動程式。



本文範例註冊驅動程式的程式片斷如下:



#define DEV_MAJOR 121
#define DEV_NAME "debug"
#define MSG(format, arg...) printk(KERN_INFO "DEBUG CARD: " format "\n", ## arg)

int init_module(void)
{
MSG("DEBUG CARD v0.1.1");
MSG(" Copyright (C) 2004 www.jollen.org");


p.s. &card_fops就是 struct file_operations card_fops

if (register_chrdev(DEV_MAJOR, DEV_NAME, &card_fops) < 0) {
MSG("Couldn't register a device.");
return -1;
}
return 0;
}





register_chrdev()參數說明如下:




˙ 第1個參數:為device file的major number。該device file應在Linux系統底下以root身份手動建立。
˙ 第2個參數:
˙ 第3個參數:為驅動程式的fops。





註冊的動作是寫在init_module()裡,因此當使用者執行insmod載入驅動程式時,register_chrdev()便會執行。由此
可知,註冊驅動程式的時機為insmod時。相對的,在rmmod時,必須執行解除註冊的動作,此動作必須實作在cleanup_module()函數
裡。



前面所介紹的4個註冊函數,其相對應的解除註冊函數如下:





˙ int unregister_chrdev(unsigned int major, const char * name) :解除註冊字元型驅動程式。
˙ int unregister_blkdev(unsigned int major, const char *name) :解除註冊區塊型驅動程式。
˙ void usb_deregister(struct usb_driver *driver):解除註冊USB驅動程式。
˙ pci_unregister_driver(struct pci_driver *drv) :解除註冊PCI驅動程式。





範例debug card 0.1.0解除註冊的程式片斷如下:




void cleanup_module(void)
{
if (unregister_chrdev(DEV_MAJOR, DEV_NAME))
MSG("failed to unregister driver");
else
MSG("driver un-installed\n");
}




Linux驅動程式的「註冊」是一個非常重要的動作,這個動作代表 Linux 驅動程式是一個嚴謹的分層式架構;換句話說,
Linux驅動程式的分層(layered)關係可透過「註冊」的程序來分析。



定義chipset標頭檔



我們所要設計的 Port 80H 除錯卡驅動程式,不需要定義標頭檔;此部份可參考 kernel 裡的 BTTV 驅動程式。



定義I/O wrapper function



我們所要設計的 Port 80H 除錯卡驅動程式,不需要定義 I/O wrapper function;此部份可參考 kernel 裡的 BTTV
驅動程式。



實作chipset控制函數



在我們所要設計的 Port 80H 除錯卡驅動程式中,我們是直接使用 kernel 的 I/O 介面來控制除錯卡,physiacl device
driver 的部份將在下一篇文章再做說明。



open/release實作



open與release是Linux驅動程式最基本的2個system call。驅動程式應先實作此2個system call。















為了方便說明起見,本文後文將以「fops->open」表示實作open system call的driver function。其它system call亦同。





open與release system call的執行時機如下:




1. 當user application執行open()函數時,便呼叫Linux kernel的open system call,即執行fops->open。



2. 當user application執行close()函數時,便呼叫Linux kernel的close system
call
,
即執行fops->release。




Linux驅動程式註冊至kernel時會指定device file的major number,user application便可以透過此符合此major
number的device file與硬體溝通
,
即Linux驅動程式是透過VFS架構層與user
application溝通。



file_operation是Linux驅動程式支援VFS的重要結構。學習file_operation的重要目的如下:



1. 了解每一個system call的用途。


2. 了解每一個system call的實作「原則」。


System call的實作原則即driver function所要負責處理的基本工作。學習Linux device
driver的重要工作之一,便是一一了解fops裡每一個system call的實作原則,並依照實際需求來實作不同的 system call。


open System Call



以open system call為例,fops->open是在user呼叫open()函數時執行,即當user開啟driver所指定的device file時呼叫fops->open。



fops->open實作原則如下:




  1. 將usage count加一(increment)


  2. 檢查inode->i_rdev


  3. 檢查裝置是否錯誤


  4. 初始化裝置


  5. 將驅動程式自己的資料結構放到filp->private_data



以下是本範例的fops->open實作:




int card_open(struct inode *inode, struct file *filp)
{
MOD_INC_USE_COUNT;
return 0;
};




release System Call



當user application 呼叫close() 函數後,便執行fops->release。



有些驅動程式會將release method函數名稱命名為 XXX_close(),但建議以XXX_release()名稱為主,以避免混淆。



fops->release實作原則如下:





  • 將 usage count 減一。





以下是本範例的fops->release實作:




int card_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
kfree(filp->private_data); //reentrant code 觀念 (本文尚未說明)

return 0;
};





--jollen



(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(751)

  • 個人分類:LINUX
▲top
  • 5月 13 週五 201115:16
  • [linux]Linux 驅動程式一般化設計流程



一般化設計流程


依照驅動程式本身的實作,可以將 Linux 驅動程式分為 2 大部份:


virtual device driver與physical device driver。


 


struct file_operations


struct file_operations 是 kernel 提供的一個重要資料結構


Linux 驅動程式建構在 file_operations 之上。file_operations定義驅動程式的system call與實作system call的函數


file_operations能切成virtual device driver與physical device driver二個部份。


 


流程解說


   Virtual device driver往上是為了連結Linux kernel的VFS層


physical device drvier往下是為了存取實體硬體。


 


Virtual Device Driver


Virtual device driver 的目的在於設計一個「機制」良好的kernel mode驅動程式,virtual device driver也必須考慮與user application的互動。實作上,則是需要善用kernel所提供的介面(interface),即kernel APIs。


Virtual device driver再分為3階段的觀念實作:



  1. 定義 file_operations

  2. 實作 system calls

  3. 註冊 driver (VFS)


fops 是指向 file_operations 結構的指標


驅動程式呼叫 register_chrdev() 將fops註冊到 kernel 裡後,fops 便成為該 device driver 所實作的system call進入點。


實作system call的函數便是透過file_operations結構來定義,我們稱實作system call的函數為driver method。


kernel 會在需要時回呼 (callback) 我們所註冊的driver method。


因此,當 driver 裡的 method 被呼叫時,kernel便將傳遞參數(parameters)給 driver method,


driver method可由 kernel 所傳遞進來的參數取得驅動程式資訊。



註冊driver的動作呼叫register_chrdev()函數完成,此函數接受3個參數如下:



  1. major:要註冊的裝置 major number

  2. name:device 名稱

  3. fops:driver 的 file operation


「註冊」這個動作觀念上是將fops加到kernel的VFS層,因此user application必須透過「device file」才能呼叫到driver method。註冊這個動作的另一層涵意則是將driver method與不同的system call做「正確的對應」,當user application呼叫system call時,才能執行正確的driver method。


Physical Device Driver


Physical device driver的目的在於實作控制硬體的程式碼。Physical device driver 的設計必須隨時查閱晶片(chipsets)的 data sheet,並透過晶片的 control register 來控制裝置。


理論上,我們可以將晶片的暫存器分成3大類:



  1. data registers           ---Data register是晶片裡用來存放資料的暫存器

  2. control registers       ---control register則是用來控制晶片行為的暫存器

  3. status registers        ---status register則保存目前晶片的狀態


 


設計控制硬體周邊的驅動程式時,需要了解硬體使用的晶片組


晶片組 要看IC設計廠商所提供的「datasheet」才能了解晶片組的暫存器名稱與用途
p.s.通常不同的暫存器會對應到一個「相對」的偏移位址(offset)。


 


驅動程式則是要透過control register才能控制晶片
實作上,首先會將晶片的 datasheet 寫成C語言的標頭檔,通常這個檔案都可以從 vendor 取得。

接著再定義一組操作暫存器的I/O函數,我們稱這組函數為I/O wrapper function
。
I/O wrapper functions通常是重新定義Linux kernel所提供的readb()、writeb()或inb()、outb()系列函數所寫成的。
利用I/O wrapper function實作一系列的控制函數,以控制實際硬體,我們稱此函數為chipset control functions
。Chipset control functions是由實作system calls的函數(driver method)所呼叫,因此在設計chipset control functions時也會回頭改寫driver method以符合此階段的實作。



(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(828)

  • 個人分類:LINUX
▲top
  • 5月 11 週三 201114:20
  • MBR 主啟動磁區剖析

打開電腦主機電源時主機板上的BIOS就開始測試電腦硬體及周邊設備,此時螢幕
左上角處將會看到RAM  數字從 0開始累加直至主機板上DRAM的數目為止,之後
你會聽到硬碟測試的聲音,且硬碟指示燈亮一下表示硬碟測試沒有問題,接下來
依序載入MBR(主開機程式)、DBR(DOS啟動記錄)、IO.SYS、MSDOS.SYS、
CONFIG.SYS、COMMAND.COM、AUTOEXEC.BAT等,待螢幕出現C:>或A:>時
即表示開機 成功。以圖式如下。

┌────┐  ┌────┐  ┌────┐
│POWER ON├→│BIOS測試├→│載入 MBR├→
└────┘  └────┘  └────┘
┌────┐  ┌────┐  ┌─────┐  ┌───────┐
│載入 DBR├→│IO.SYS  ├→│MSDOS.SYS ├→│載入CONFIG.SYS├→
└────┘  └────┘  └─────┘  └───────┘
┌────────┐  ┌────────┐  ┌─────┐
│載入AUTOEXEC.BAT├→│螢幕出現C:>或A:>├→│ 開機成功 │
└────────┘  └────────┘  └─────┘
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(1,627)

  • 個人分類:LINUX
▲top
  • 5月 09 週一 201114:32
  • [linux]Device File

什麼是 Device File
Device files 是 UNIX 系統的獨特觀念,在 UNIX 系統底下我們把外部的周邊裝置均視為一個檔案,並透過此檔案與實體硬體溝通,這樣的檔案就叫做 device files,或 special files。
 
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(437)

  • 個人分類:LINUX
▲top
  • 5月 09 週一 201114:26
  • System Call 與驅動程式的關係

System call 是 user application 與 Linux device driver 的溝通介面。
User application 透過呼叫 system call 來「叫起」driver 的 task,user application 要呼叫 system call 必須呼叫 GNU C 所提供的「wrapper function」,每個 system call 都會對應到 driver 內的一個 task,此 task 即是 file_operation 函數指標所指的函數。
 
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(665)

  • 個人分類:LINUX
▲top
  • 5月 04 週三 201109:40
  • 智慧型手機作業系統

智慧型手機作業系統包括有Symbian OS、BlackBerry OS、Windows Mobile、Linux、Palm webOS、iOS與Android。
其中Symbian OS與BlackBerry OS分別來自於通訊產業當中的巨擘NOKIA與RIM。
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(31)

  • 個人分類:Andriod
▲top
  • 4月 29 週五 201120:34
  • VMware虛擬機下網絡連接的三種模式

很多朋友都用vmware來測試不同的系統,我結合自己的經驗談一下對網絡設置的理解,不對的地方請指正。
  bridge:
(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(1,149)

  • 個人分類:LINUX
▲top
  • 4月 29 週五 201120:20
  • 背光板驅動控制積體電路引腳定義的中英對照




1.  ENA 、STB---- 使能控制 積體電路啟動端
ON/OFF功能
2.  REF、 VREF、Vref、REG -----基準電壓輸出端
3.  SS 、SST
-----軟啟動控制 外接電容器
4.  RT------  外接振盪頻率定時電阻
5.  CT、CTOSC
-----  外接背光燈管工作振盪頻率定時電容
6.  RT_CT 、 RT_CTOSC -----  背光燈管振盪頻率控制元件組合輸入端 外 
   接 定時 電阻 和電容
7.  LCT -----  外接 PWM三角波振盪頻率 定時電容
8.  LRT_LCT
、CTPWM-----   外接 PWM三角波振盪頻率 定時電阻和電容LPWM、PWMOUT 
 亮度直流控制信號轉亮度PWM信號輸出
9. RT1-----   外接 啟動瞬間提高頻率振盪定時電阻
10. CT1
-----  外接 啟動瞬間提高頻率振盪定時電容
11.  VCC 、 VIN 、 VDD 、 AVDD 、 PVDD
-----積體電路供電輸入端
12.  AGND 、 PGND----- 積體電路接地端
13.   CTIRM 、
TIRM-----延遲保護的延遲時間設定 外接延遲電容
14.    DIM 、BRI 、 BRIT、 ADIM (直流)、 BDIM(PWM)
、ADJ ----  亮度控制輸入端
15.  SYNC----- 兩塊積體電路頻率同步介面
16.  OVP 、
CLAMP----- 過壓保護取樣輸入  過壓保護
17.  OVT----- 過壓調整取樣輸入
18. 
 VSEN-----輸出電壓取樣檢測輸入端
19.   ISEN 、 FB 、 INN-----
背光燈管電流取樣檢測輸入端
20.  CMP----- 誤差放大器負載端 一般接電容或低通濾波器
21.   VLS
UVLO----- 積體電路 VCC供電欠壓保護輸入端
22.  NOUT 、NDR -----N溝道MOS管激勵輸出
23. 
 POUT 、PDR----- P溝道MOS管激勵輸出
24.   OUTL----- 反相激勵輸出
25.  OUTH
-----正相激勵輸出
26.  DRV1 、 DRV2----- 正反相激勵輸出
27.   RTDLY-----
外接基準電流控制電阻 設定內部基準電流 並控制多激勵輸出的波形的延時
28.   SCP----- 短路保護
29. 
 OLP----- 背光燈管斷路保護  過流保護
30.   FAIL -----  保護狀態時鐘信號輸出端


(繼續閱讀...)
文章標籤

pcman 發表在 痞客邦 留言(0) 人氣(137)

  • 個人分類:顯示器
▲top
«123...6»

GTV 大視界

文章分類

toggle OS (2)
  • LINUX (13)
  • Andriod (1)
toggle 案件 (1)
  • 嵌入式系統 (0)
toggle 電子電路 (1)
  • 顯示器 (1)
toggle 程式語言 (1)
  • VB (24)
toggle 流行女裝 (2)
  • 白鳥花子 (0)
  • 天母嚴選 (0)
  • 硬碟 (1)
  • 處理器 (2)
  • 顯示卡 (5)
  • 喇叭音效 (1)
  • 電源 (1)
  • 螢幕 (5)
  • 未分類文章 (1)

文章搜尋

熱門文章

  • (4,441)[VB][IO]如何存取檔案
  • (4,275)[VB][系統]如何製作延遲時間
  • (2,903)動態對比是什麼
  • (1,697)GUID磁碟分割表
  • (1,549)[VB][網頁]vb.net介面程式自動連線至網頁,並且自動發訊息至手機上
  • (1,017)[VB][網頁]如何抓到網頁中圖片的URL
  • (721)[VB][網路]VB.NET 如何讀取網頁.並自動跳下一頁
  • (665)System Call 與驅動程式的關係
  • (437)[linux]Device File
  • (364)[VB][網路]WebBrowser載入去的網頁如果有捲軸時,自動移到最下頁

最新文章

  • [VBA]取出網頁的特定資料
  • [VB]WebBrowser.ObjectForScripting
  • [C#]JavaScript與C# Windows應用程序交互
  • [VB]webbrowser 控件實現WinForm與WebForm交互
  • [VB] WebBrowser 判斷該網頁己被下載完成
  • [linux]Kernel使用的資料結構
  • [linux]Block Device Driver和 Character Device Driver
  • [linux]QEMU
  • [linux]將 driver 掛載到 kernel 上
  • [linux]撰寫 driver 程式

BloggerADS

最新留言

    文章精選

    VB教學網站

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    站長工具