浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » 接口電路

ARM的嵌入式Linux移植體驗(yàn)之設(shè)備驅(qū)動(dòng)

發(fā)布時(shí)間:2008/8/20 0:00:00 訪(fǎng)問(wèn)次數(shù):413

  設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,它為應(yīng)用程序屏蔽硬件的細(xì)節(jié),一般來(lái)說(shuō),linux的設(shè)備驅(qū)動(dòng)程序需要完成如下功能:

  ·設(shè)備初始化、釋放;

  ·提供各類(lèi)設(shè)備服務(wù);

  ·負(fù)責(zé)內(nèi)核和設(shè)備之間的數(shù)據(jù)交換;

  ·檢測(cè)和處理設(shè)備工作過(guò)程中出現(xiàn)的錯(cuò)誤。

  linux下的設(shè)備驅(qū)動(dòng)程序被組織為一組完成不同任務(wù)的函數(shù)的集合,通過(guò)這些函數(shù)使得windows的設(shè)備操作猶如文件一般。在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,如open ()、close ()、read ()、write () 等。

  linux主要將設(shè)備分為二類(lèi):字符設(shè)備和塊設(shè)備。字符設(shè)備是指設(shè)備發(fā)送和接收數(shù)據(jù)以字符的形式進(jìn)行;而塊設(shè)備則以整個(gè)數(shù)據(jù)緩沖區(qū)的形式進(jìn)行。在對(duì)字符設(shè)備發(fā)出讀/寫(xiě)請(qǐng)求時(shí),實(shí)際的硬件i/o一般就緊接著發(fā)生了;而塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶(hù)進(jìn)程對(duì)設(shè)備請(qǐng)求能滿(mǎn)足用戶(hù)的要求,就返回請(qǐng)求的數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來(lái)進(jìn)行實(shí)際的i/o操作。塊設(shè)備主要針對(duì)磁盤(pán)等慢速設(shè)備。

  1.內(nèi)存分配

  由于linux驅(qū)動(dòng)程序在內(nèi)核中運(yùn)行,因此在設(shè)備驅(qū)動(dòng)程序需要申請(qǐng)/釋放內(nèi)存時(shí),不能使用用戶(hù)級(jí)的malloc/free函數(shù),而需由內(nèi)核級(jí)的函數(shù)kmalloc/kfree () 來(lái)實(shí)現(xiàn),kmalloc()函數(shù)的原型為:

  void kmalloc (size_t size ,int priority);

  參數(shù)size為申請(qǐng)分配內(nèi)存的字節(jié)數(shù),kmalloc最多只能開(kāi)辟128k的內(nèi)存;參數(shù)priority說(shuō)明若kmalloc()不能馬上分配內(nèi)存時(shí)用戶(hù)進(jìn)程要采用的動(dòng)作:

gfp_kernel 表示等待,即等kmalloc()函數(shù)將一些內(nèi)存安排到交換區(qū)來(lái)滿(mǎn)足你的內(nèi)存需要,gfp_atomic 表示不等待,如不能立即分配到內(nèi)存則返回0 值;函數(shù)的返回值指向已分配內(nèi)存的起始地址,出錯(cuò)時(shí),返回0。

  kmalloc ()分配的內(nèi)存需用kfree()函數(shù)來(lái)釋放,kfree ()被定義為:

# define kfree (n) kfree_s( (n) ,0)

  其中kfree_s () 函數(shù)原型為:

void kfree_s (void * ptr ,int size);

  參數(shù)ptr為kmalloc()返回的已分配內(nèi)存的指針,size是要釋放內(nèi)存的字節(jié)數(shù),若為0 時(shí),由內(nèi)核自動(dòng)確定內(nèi)存的大小。

  2.中斷

  許多設(shè)備涉及到中斷操作,因此,在這樣的設(shè)備的驅(qū)動(dòng)程序中需要對(duì)硬件產(chǎn)生的中斷請(qǐng)求提供中斷服務(wù)程序。與注冊(cè)基本入口點(diǎn)一樣,驅(qū)動(dòng)程序也要請(qǐng)求內(nèi)核將特定的中斷請(qǐng)求和中斷服務(wù)程序聯(lián)系在一起。在linux中,用request_irq()函數(shù)來(lái)實(shí)現(xiàn)請(qǐng)求:

int request_irq (unsigned int irq ,void( * handler) int ,unsigned long type ,char * name);

參數(shù)irq為要中斷請(qǐng)求號(hào),參數(shù)handler為指向中斷服務(wù)程序的指針,參數(shù)type 用來(lái)確定是正常中斷還是快速中斷(正常中斷指中斷服務(wù)子程序返回后,內(nèi)核可以執(zhí)行調(diào)度程序來(lái)確定將運(yùn)行哪一個(gè)進(jìn)程;而快速中斷是指中斷服務(wù)子程序返回后,立即執(zhí)行被中斷程序,正常中斷type 取值為0 ,快速中斷type 取值為sa_interrupt),參數(shù)name是設(shè)備驅(qū)動(dòng)程序的名稱(chēng)。

  4.塊設(shè)備驅(qū)動(dòng)

  塊設(shè)備驅(qū)動(dòng)程序的編寫(xiě)是一個(gè)浩繁的工程,其難度遠(yuǎn)超過(guò)字符設(shè)備,上千行的代碼往往只能搞定一個(gè)簡(jiǎn)單的塊設(shè)備,而數(shù)十行代碼就可能搞定一個(gè)字符設(shè)備。因此,非得有相當(dāng)?shù)幕竟Σ拍芡瓿纱隧?xiàng)工作。下面先給出一個(gè)實(shí)例,即mtdblock塊設(shè)備的驅(qū)動(dòng)。我們通過(guò)分析此實(shí)例中的代碼來(lái)說(shuō)明塊設(shè)備驅(qū)動(dòng)程序的寫(xiě)法(由于篇幅的關(guān)系,大量的代碼被省略,只保留了必要的主干):

#include <linux/config.h>
#include <linux/devfs_fs_kernel.h>
static void mtd_notify_add(struct mtd_info* mtd);
static void mtd_notify_remove(struct mtd_info* mtd);
static struct mtd_notifier notifier = {
 mtd_notify_add,
 mtd_notify_remove,
 null
};
static devfs_handle_t devfs_dir_handle = null;
static devfs_handle_t devfs_rw_handle[max_mtd_devices];

static struct mtdblk_dev {
 struct mtd_info *mtd; /* locked */
 int count;
 struct semaphore cache_sem;
 unsigned char *cache_data;
 unsigned long cache_offset;
 unsigned int cache_size;
 enum { state_empty, state_clean, state_dirty } cache_state;
} *mtdblks[max_mtd_devices];

static spinlock_t mtdblks_lock;
/* this lock is used just in kernels >= 2.5.x */
static spinlock_t mtdblock_lock;

static int mtd_sizes[max_mtd_devices];
static int mtd_blksizes[max_mtd_devices];

static void erase_callback(struct erase_info *done)
{

  設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,它為應(yīng)用程序屏蔽硬件的細(xì)節(jié),一般來(lái)說(shuō),linux的設(shè)備驅(qū)動(dòng)程序需要完成如下功能:

  ·設(shè)備初始化、釋放;

  ·提供各類(lèi)設(shè)備服務(wù);

  ·負(fù)責(zé)內(nèi)核和設(shè)備之間的數(shù)據(jù)交換;

  ·檢測(cè)和處理設(shè)備工作過(guò)程中出現(xiàn)的錯(cuò)誤。

  linux下的設(shè)備驅(qū)動(dòng)程序被組織為一組完成不同任務(wù)的函數(shù)的集合,通過(guò)這些函數(shù)使得windows的設(shè)備操作猶如文件一般。在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,如open ()、close ()、read ()、write () 等。

  linux主要將設(shè)備分為二類(lèi):字符設(shè)備和塊設(shè)備。字符設(shè)備是指設(shè)備發(fā)送和接收數(shù)據(jù)以字符的形式進(jìn)行;而塊設(shè)備則以整個(gè)數(shù)據(jù)緩沖區(qū)的形式進(jìn)行。在對(duì)字符設(shè)備發(fā)出讀/寫(xiě)請(qǐng)求時(shí),實(shí)際的硬件i/o一般就緊接著發(fā)生了;而塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶(hù)進(jìn)程對(duì)設(shè)備請(qǐng)求能滿(mǎn)足用戶(hù)的要求,就返回請(qǐng)求的數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來(lái)進(jìn)行實(shí)際的i/o操作。塊設(shè)備主要針對(duì)磁盤(pán)等慢速設(shè)備。

  1.內(nèi)存分配

  由于linux驅(qū)動(dòng)程序在內(nèi)核中運(yùn)行,因此在設(shè)備驅(qū)動(dòng)程序需要申請(qǐng)/釋放內(nèi)存時(shí),不能使用用戶(hù)級(jí)的malloc/free函數(shù),而需由內(nèi)核級(jí)的函數(shù)kmalloc/kfree () 來(lái)實(shí)現(xiàn),kmalloc()函數(shù)的原型為:

  void kmalloc (size_t size ,int priority);

  參數(shù)size為申請(qǐng)分配內(nèi)存的字節(jié)數(shù),kmalloc最多只能開(kāi)辟128k的內(nèi)存;參數(shù)priority說(shuō)明若kmalloc()不能馬上分配內(nèi)存時(shí)用戶(hù)進(jìn)程要采用的動(dòng)作:

gfp_kernel 表示等待,即等kmalloc()函數(shù)將一些內(nèi)存安排到交換區(qū)來(lái)滿(mǎn)足你的內(nèi)存需要,gfp_atomic 表示不等待,如不能立即分配到內(nèi)存則返回0 值;函數(shù)的返回值指向已分配內(nèi)存的起始地址,出錯(cuò)時(shí),返回0。

  kmalloc ()分配的內(nèi)存需用kfree()函數(shù)來(lái)釋放,kfree ()被定義為:

# define kfree (n) kfree_s( (n) ,0)

  其中kfree_s () 函數(shù)原型為:

void kfree_s (void * ptr ,int size);

  參數(shù)ptr為kmalloc()返回的已分配內(nèi)存的指針,size是要釋放內(nèi)存的字節(jié)數(shù),若為0 時(shí),由內(nèi)核自動(dòng)確定內(nèi)存的大小。

  2.中斷

  許多設(shè)備涉及到中斷操作,因此,在這樣的設(shè)備的驅(qū)動(dòng)程序中需要對(duì)硬件產(chǎn)生的中斷請(qǐng)求提供中斷服務(wù)程序。與注冊(cè)基本入口點(diǎn)一樣,驅(qū)動(dòng)程序也要請(qǐng)求內(nèi)核將特定的中斷請(qǐng)求和中斷服務(wù)程序聯(lián)系在一起。在linux中,用request_irq()函數(shù)來(lái)實(shí)現(xiàn)請(qǐng)求:

int request_irq (unsigned int irq ,void( * handler) int ,unsigned long type ,char * name);

參數(shù)irq為要中斷請(qǐng)求號(hào),參數(shù)handler為指向中斷服務(wù)程序的指針,參數(shù)type 用來(lái)確定是正常中斷還是快速中斷(正常中斷指中斷服務(wù)子程序返回后,內(nèi)核可以執(zhí)行調(diào)度程序來(lái)確定將運(yùn)行哪一個(gè)進(jìn)程;而快速中斷是指中斷服務(wù)子程序返回后,立即執(zhí)行被中斷程序,正常中斷type 取值為0 ,快速中斷type 取值為sa_interrupt),參數(shù)name是設(shè)備驅(qū)動(dòng)程序的名稱(chēng)。

  4.塊設(shè)備驅(qū)動(dòng)

  塊設(shè)備驅(qū)動(dòng)程序的編寫(xiě)是一個(gè)浩繁的工程,其難度遠(yuǎn)超過(guò)字符設(shè)備,上千行的代碼往往只能搞定一個(gè)簡(jiǎn)單的塊設(shè)備,而數(shù)十行代碼就可能搞定一個(gè)字符設(shè)備。因此,非得有相當(dāng)?shù)幕竟Σ拍芡瓿纱隧?xiàng)工作。下面先給出一個(gè)實(shí)例,即mtdblock塊設(shè)備的驅(qū)動(dòng)。我們通過(guò)分析此實(shí)例中的代碼來(lái)說(shuō)明塊設(shè)備驅(qū)動(dòng)程序的寫(xiě)法(由于篇幅的關(guān)系,大量的代碼被省略,只保留了必要的主干):

#include <linux/config.h>
#include <linux/devfs_fs_kernel.h>
static void mtd_notify_add(struct mtd_info* mtd);
static void mtd_notify_remove(struct mtd_info* mtd);
static struct mtd_notifier notifier = {
 mtd_notify_add,
 mtd_notify_remove,
 null
};
static devfs_handle_t devfs_dir_handle = null;
static devfs_handle_t devfs_rw_handle[max_mtd_devices];

static struct mtdblk_dev {
 struct mtd_info *mtd; /* locked */
 int count;
 struct semaphore cache_sem;
 unsigned char *cache_data;
 unsigned long cache_offset;
 unsigned int cache_size;
 enum { state_empty, state_clean, state_dirty } cache_state;
} *mtdblks[max_mtd_devices];

static spinlock_t mtdblks_lock;
/* this lock is used just in kernels >= 2.5.x */
static spinlock_t mtdblock_lock;

static int mtd_sizes[max_mtd_devices];
static int mtd_blksizes[max_mtd_devices];

static void erase_callback(struct erase_info *done)
{

相關(guān)IC型號(hào)
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線(xiàn):13751165337  13692101218
粵ICP備09112631號(hào)-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!