![]() |
學(xué)校地址:湖南省 長沙市 雨花區(qū) 車站南路紅花坡路口 |
![]() |
學(xué)校地址:湖南省 長沙市 雨花區(qū) 車站南路紅花坡路口 |
一般來說,我們在編譯kernel時,設(shè)備驅(qū)動的選擇有兩種方式:一種是直接編譯到kernel里,另一種是以模塊方式掛接。CS8900網(wǎng)卡驅(qū)動如果以模塊方式掛接,函數(shù)init_module就是入口;如果是直接編譯到kernel里,那么函數(shù)cs89x0_probe才是入口。在此入口函數(shù)中,將完成網(wǎng)卡驅(qū)動的各項初始化。如注冊虛擬地址,設(shè)備號,中斷號,以及各個相關(guān)寄存器的初始化。
cs89x0_probe函數(shù)里會去調(diào)用真正的初始化函數(shù)cs89x0_probe1。下面說一下該初始化函數(shù)里需要完成的幾個重要地方:
1、 注冊虛擬地址。
通過request_region函數(shù)注冊虛擬地址。在kenel里面,我們所操作的寄存器的地址其實都是虛擬地址,但是每一個寄存器的虛擬地址都有唯一和其對應(yīng)的物理地址,因為在kernel里面任何虛擬地址都會通過MMU轉(zhuǎn)化成物理地址。所以在kernel里,定義完所要用到的寄存器后,都必須使用一個函數(shù)ioremap將我們所要用到的寄存器的物理地址轉(zhuǎn)換成為在kernel里可以操作的虛擬地址,然后才能將他們用以具體的操作,否則一切都是徒勞。
ioaddr = (int)ioremap(BASE_ADDR,16);
2、填充net_device結(jié)構(gòu)體。
該結(jié)構(gòu)體的成員都是和網(wǎng)絡(luò)設(shè)備有關(guān)的變量。其中比較重要的有兩個:dev_addr和open。dev_addr里要存的是主機的MAC地址,一般都是從eeproom中讀出來再存放到該變量中,當(dāng)然也可以根據(jù)自己的需要手動賦值。
for (i=0; i < ETH_ALEN/2; i++) { unsigned int Addr; Addr = readreg(dev, PP_IA+i*2); dev->dev_addr = Addr & 0xFF; dev->dev_addr = Addr >> 8;}
Open是一個函數(shù)指針,需要把net_open函數(shù)賦值給他。net_open函數(shù)是一個專門用來注冊網(wǎng)絡(luò)設(shè)備中斷號的函數(shù),輸入ifconfig命令時, 后就會調(diào)用到這個函數(shù)。在這個函數(shù)中要把中斷號設(shè)置一下。
writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON); request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
3、 I/O端口的中斷請求設(shè)置。
網(wǎng)卡不可能也不需要時時刻刻都處于中斷狀態(tài),合理的中斷觸發(fā)時機是一個必要條件。根據(jù)硬件電路圖的引腳可知,相對應(yīng)的中斷請求寄存器是GPG1和EINT9。在GPG1寄存器里面要把EINT9寄存器功能激活,而在EINT9寄存器里面則要把中斷設(shè)置為上跳沿觸發(fā)。
writel(readl(S 3C2410_GPGCON) | 0x8, S3C2410_GPGCON); writel(readl(S3C2410_EXTINT1) | 0x40, S3C2410_EXTINT1);
還有一點要注意,CS8900網(wǎng)卡的寄存器都是16位的,所以在選擇讀寫函數(shù)時也必須選擇16位寄存器的讀寫函數(shù)。
static u16 readword(unsigned long base_addr, int portno){ return inw(base_addr + portno); } static void writeword(unsigned long base_addr, int portno, u16 value){ outw(value, base_addr + portno);}
以上便是Linux kernel2.6.25 CS8900網(wǎng)卡驅(qū)動移植所需注意的內(nèi)容。Kernel里面涉及和兼容的東西非常多,去除容易產(chǎn)生沖突的部分,添加自己需要實現(xiàn)的功能,可以使得移植工作能夠順利進行。
|
關(guān)于收錄1 |
關(guān)于收錄2 |
網(wǎng)站幫助 |
廣告合作 |
下載聲明 |
友情連接 |
網(wǎng)站地圖 |
| 共有文章: 16835 篇
今日新文: 0 篇
當(dāng)前在線: