linux編寫驅動
『壹』 怎樣編寫linux設備驅動程序
Linux是Unix操作系統的一種變種,在Linux下編寫驅動程序的原理和思想完全類似於其他的Unix系統,但它dos或window環境下的驅動程序有很大的區別。在Linux環境下設計驅動程序,思想簡潔,操作方便,功能也很強大,但是支持函數少,只能依賴kernel中的函數,有些常用的操作要自己來編寫,而且調試也不方便。本人這幾周來為實驗室自行研製的一塊多媒體卡編制了驅動程序,獲得了一些經驗,願與Linux fans共享
一、Linux device driver 的概念系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統內核和機器硬體之間的介面。設備驅動程序為應用程序屏蔽了硬體的細節,這樣在應用程序看來,硬體設備只是一個設備文件, 應用程序可以象操作普通文件一樣對硬體設備進行操作。設備驅動程序是內核的一部分,它完成以下的功能:
1.對設備初始化和釋放。
2.把數據從內核傳送到硬體和從硬體讀取數據。
3.讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據。
4.檢測和處理設備出現的錯誤。
二、實例剖析我們來寫一個最簡單的字元設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。
『貳』 Linux下編寫USB驅動
有些USB是識別不了?
你掛載磁碟了嗎?
『叄』 編寫linux或驅動工資一般是多少
能看懂內核與會編譯內核是兩個級別。。
工資的話也不一定,各地有所不同,就算你說你很厲害,進了公司也有一定時間的考核期,只有得到領導的認可工資才能加上去。。
我一個同學搞HP—UNIX的,在上海那邊,一年拿70多萬。。
要寫內核對C就要精通。。。
精通C的一般工資都不會少與3000,加上你會內核編譯,一個月5000以上是沒什麼問題的。。
=====================
嵌入式系統開發近些年來搞的也很火,有能力的話也可以去試試看.工資方面我也不是很清楚,不過應該也不會很低,差不多吧都..什麼工作也要看你的水平和工作經驗
不過你說是一個本科生,我不知道你有沒有工作經驗,如果沒有。。那很難說了。。開始一個月有2000就是高的了。。
『肆』 如何編寫Linux的驅動程序
}; //IO功能選項,硬體上拉輸出 static unsigned int gpio_cfg_table[] = { S3C2410_GPB5_OUTP, S3C2410_GPB6_OUTP, S3C2410_GPB7_OUTP, S3C2410_GPB8_OUTP, }; //編寫一個ioctl函數,這個函數提供給用戶端使用(也就是用戶態使用) static int my_ioctl(struct inode *inode,struct file* file,unsigned int cmd, unsigned long arg) { if (arg > 4) { return -EINVAL; } if (cmd == 1) //led ON { s3c2410_gpio_setpin(gpio_table[arg],0); return 0; } if (cmd == 0) //led OFF { s3c2410_gpio_setpin(gpio_table[arg],1); return 0; } else { return -EINVAL; } } //一個和文件設備相關的結構體。 static struct file_operations dev_fops = { .owner = THIS_MODULE, .ioctl = my_ioctl, //.read = my_read, //這個暫時屏蔽,一會我們再加入一個讀操作的函數 }; //linux中設備的注冊結構體 static struct miscdevice misc =
{ .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; //設備初始化(包括注冊)函數 static int __init dev_init(void) { int ret; int i; for (i=0;i<4;i++) { s3c2410_gpio_cfgpin(gpio_table[i],gpio_cfg_table[i]); s3c2410_gpio_setpin(gpio_table[i],0); mdelay(500); s3c2410_gpio_setpin(gpio_table[i],1); } ret = misc_register(&misc); printk(DEVICE_NAME"MY_LED_DRIVER init ok\n"); return ret; } //設備注銷函數 static void __exit dev_exit(void) { misc_deregister(&misc); } //與模塊相關的函數 mole_init(dev_init); mole_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("blog.ednchina.com/itspy");
MODULE_DESCRIPTION("MY LED DRIVER"); 到此,上面就完成了一個簡單的驅動(別急,下面我們再會稍微增加點復雜的東西),以上代碼的可以簡單概括為:像自己寫51單片機或者ARM的裸奔程序一樣操作IO函數,然後再linux系統中進行相關必須的函數關聯和注冊。 為什麼要關聯呢,為什麼注冊呢? 因為這是必須的,從以下這些結構體就知道了。 stuct file_operations{ struct mole *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); … } file_operations 結構體中包括了很多與設備相關的函數指針,指向了驅動所提供的函數。 struct inode{ struct hlist_node i_hash; struct list_head i_list; struct list_head i_sb_list; struct list_head i_dentry; unsigned long i_ino; atomic_t i_count; unsigned int i_nlink; uid_t i_uid; gid_t i_gid; dev_t i_rdev; u64 i_version; loff_t i_size; … } inode 是 UNIX 操作系統中的一種數據結構,它包含了與文件系統中各個文件相關的一些重要信息。在 UNIX 中創建文件系統時,同時將會創建大量的 inode 。通常,文件系統磁碟空間中大約百分之一空間分配給了 inode 表。 大略了解以上信息之後,我們只需把我們所要實現的功能和結構體關聯起來。上例中已經完成IO寫操作的函數,現在我們再添加一個讀的函數。基於這種原理,我們想實現各種功能的驅動也就很簡單了。 //添加讀函數示意, 用戶層可以通過 read函數來操作。 static int my_read(struct file* fp, char __user *dat,size_t cnt) { size_t i; printk("now read the hardware...\n"); for(i=0;i<cnt;i++) dat[i] = 'A'; dat[i] = '\0'; return cnt; } 這樣,完成驅動編寫。編譯之後,本驅動可以通過直接嵌入內核中,也可以以模塊的嵌入的形式載入到linux內核中去。 完成了驅動,寫個應用程序了驗證一下吧: int main(int argc,char ** argv) {
int on; int led_no; int fd; char str[10]; int cnt =0; fd = open("/dev/MY_LED_DRIVER",0); if (fd < 0) { printf("can't open dev\n"); exit(1); } printf("read process\n"); cnt = read(fd,str,10); printf("get data from driver:\n%s\ncount = %d\n",str,cnt); printf("read process end \n"); cnt = 0; printf("running...\n"); while(cnt++<1000) { ioctl(fd,0,0); //led off ioctl(fd,0,1); ioctl(fd,0,2); ioctl(fd,0,3); sleep(1); //printf("sdfdsfdsfdsfds...\n"); ioctl(fd,1,0); //led on ioctl(fd,1,1); ioctl(fd,1,2); ioctl(fd,1,3); sleep(1); printf("%d\b",cnt); } close(fd); return 0; }
『伍』 請教:linux驅動編寫流程,疑惑不止一點點哦!
你至少要先學習Linux的應用程序,然後再學習驅動程序才好,不會用驅動也不會寫好。
1、不需要去掉所有的驅動,你把你要寫的編譯成mole就可以了,當然必須要讓kernel支持mole。當然mole的寫法自己慢慢琢磨吧。
2、Linux工程師是一個龐大隊伍通稱,就好像計算機工程師做什麼一樣,不好回答。僅我接觸的一個Linux為主的項目就有10萬人參與,代碼編寫幾年,這么大的團隊,你常見的計算機類的職業都有了。
3、每一個設備,小到中斷控制器、計數器、定時器,大到CPU(體系結構)驅動、甚至虛擬文件系統(不是VFS,主要是類似集群文件系統,但是毫無疑問文件系統驅動也都比較龐大)等。
『陸』 怎麼在linux下編寫驅動程序
這個你想在這里得到什麼答案啊?usb分為host驅動和device驅動,看你說的是哪一種。我就是寫過usbhost和device驅動的,一般來說看spec和研究linux代碼,仔細閱讀下linux下usb的子系統代碼吧,不是一朝一夕就能說的清楚的。我過一陣子會出點usbhost和device開發的總結性文章。還有usb2.0和usb3.0的host驅動是不一樣的,device也多了點描述符,而且不同版本的傳輸協議基本上很大不同了。
『柒』 如何編寫Linux 驅動程序
以裝載和卸載模塊為例:
1、首先輸入代碼
#include <linux/init.h>
#include <linux/mole.h>
『捌』 如何Linux操作系統驅動程序編寫
是的 Linux嵌入式開發包括了Linux驅動開發.Linux嵌入式開發,包括了從應用層到底層驅動等等,驅動開發就屬於底層開發. 都要學的基礎知識,就是C語言,Linux,還有各種計算機原理那塊的知識.
『玖』 如何編寫linux操作系統下的設備驅動程序
Linux是Unix操作系統的一種變種,在Linux下編寫驅動程序的原理和
思想完全類似於其他的Unix系統,但它dos或window環境下的驅動程序有很大的
區別.在Linux環境下設計驅動程序,思想簡潔,操作方便,功能也很強大,但是
支持函數少,只能依賴kernel中的函數,有些常用的操作要自己來編寫,而且調
試也不方便.本人這幾周來為實驗室自行研製的一塊多媒體卡編制了驅動程序,
獲得了一些經驗,願與Linux fans共享,有不當之處,請予指正.
以下的一些文字主要來源於khg,johnsonm的Write linux device driver,
Brennan's Guide to Inline Assembly,The Linux A-Z,還有清華BBS上的有關
device driver的一些資料. 這些資料有的已經過時,有的還有一些錯誤,我依
據自己的試驗結果進行了修正.
一. Linux device driver 的概念
系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統
內核和機器硬體之間的介面.設備驅動程序為應用程序屏蔽了硬體的細節,這樣
在應用程序看來,硬體設備只是一個設備文件, 應用程序可以象操作普通文件
一樣對硬體設備進行操作.設備驅動程序是內核的一部分,它完成以下的功能:
1.對設備初始化和釋放.
2.把數據從內核傳送到硬體和從硬體讀取數據.
3.讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據.
4.檢測和處理設備出現的錯誤.
在Linux操作系統下有兩類主要的設備文件類型,一種是字元設備,另一種是
塊設備.字元設備和塊設備的主要區別是:在對字元設備發出讀/寫請求時,實際
的硬體I/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作緩沖區,
當用戶進程對設備請求讀/寫時,它首先察看緩沖區的內容,如果緩沖區的數據
能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際
的I/O操作.塊設備是主要針對磁碟等慢速設備設計的,以免耗費過多的CPU時間
來等待.
已經提到,用戶進程是通過設備文件來與實際的硬體打交道.每個設備文件都
都有其文件屬性(c/b),表示是字元設備還蔤強檣璞?另外每個文件都有兩個設
備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個
設備驅動程序的不同的硬體設備,比如有兩個軟盤,就可以用從設備號來區分
他們.設備文件的的主設備號必須與設備驅動程序在登記時申請的主設備號
一致,否則用戶進程將無法訪問到驅動程序.
最後必須提到的是,在用戶進程調用驅動程序時,系統進入核心態,這時不再是
搶先式調度.也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他
的工作.如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就
是漫長的fsck