linux核心移植 DM9000C移植筆記

2021-07-27 11:36:30 字數 3188 閱讀 2006

一、開發環境

1、核心:linux2.6.22.6;

2、jz2440;

3、ubuntu 9.10;

4、dm9dev9000c.c。

二、移植過程

1、修改驅動dm9dev9000c.c。

(1)1610行#ifdef module和最後一行#endif注釋掉。

(2)最後幾行新增修飾命令,並修改入口和出口函式的名字(可以不用改)

module_init(dm9000c_init); //dm9000c_init對應之前入口函式init_module

module_exit(dm9000c_exit);//dm9000c_exit對應cleanup_module

(3)修改原init_module、cleanup_module函式。

(4)網絡卡的片選訊號接在ngcs4,如果可以識別網絡卡,低電平有效,根據s3c2440晶元手冊的memory controller一節,cpu發出的實體地址必須在0x20000000-0x28000000,才能識別出網絡卡;在網絡卡驅動程式的入口函式​裡新增一行語句:

iobase=(int)ioremap(0x20000000,1024);在出口函式登出對映iounmap((void *)iobase)。

(5)開發板的dm9000c網絡卡中斷引腳是接的外部中斷7,即irq_eint7,在入口函式新增一行語句 irq=irq_eint7。

(6)修改中斷觸發方式。源廠商提供的網絡卡驅動程式無觸發方式,需設定乙個觸發方式,申請中斷函式是dmfe_open,在該函式裡將中斷方式修改了request_irq(dev->irq,&dmfe_interrupt,irqf_trigger_rising,dev->name,dev)。

(7)根據驅動程式的除錯得知,需注釋源廠商提供的驅動程式其中dmfe_probe1函式裡的一行語句。

(8)設定s3c2440的memory controller暫存器​(如果不設定,這樣網絡卡驅動程式就依賴uboot,為了更加完善,配置一下暫存器。在入口函式dm9000c_init裡新增:​

volatile unsigned long *bwscon;

volatile unsigned long *bankcon4;

unsigned long val;

// 對映,設定暫存器 

bwscon=ioremap(0x48000000,4);//0x48000000為bwscon的實體地址

bankcon4=ioremap(0x48000014,4);

//*bit[19]=0      st4     0 = not using ub/lb (the pins are dedicated nwbe[3:0])

*bit[18]=0      ws4     0 = wait disable//dm9000c網絡卡晶元沒有接等待訊號

*bit[17:16]=1  dw4     01 = 16-bit     //dm9000c網絡卡是16位模式

//val=*bwscon;

val &=~(0xf<<16);

val |=(1<<16);

*bwscon=val;

//*bit[14:13]=0        位址訊號發出後多久發片選訊號    00 = 0 clock

*bit[12:11]=0       片選訊號發出後多久發出讀訊號     00 = 0 cloc

​*bit[10:8]=1          讀/寫訊號脈衝寬度                       001 = 2 clocks

*bit[7:6]=1           讀訊號消失後,位址訊號和片選訊號還要維持多久       01 = 1 clock

*bit[5:4]=0           片選訊號消失多久後位址訊號消失       00 = 0 clock

*bit[1:0]=0           正常模式           00 = normal (1 data)

//*bankcon4=(1<<8)|(1<<6);

iounmap(bwscon);//釋放對映的位址

iounmap(bankcon4);

​//if((db->chip_revision!=0x1a) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -enodev;

(9)​新增標頭檔案

到此驅動程式修改好了,拷貝到虛擬機器裡進行編譯時,出現了錯誤,發現缺少了標頭檔案,根據提示新增一下幾句:

#include

#include

#include

#include

2、在驅動目錄下新增makefile檔案。

kern_dir = /work/system/linux-2.6.22.6  //編譯網絡卡驅動程式使用的linux核心所在的目錄

all:

make -c $(kern_dir) m=`pwd` modules 

clean:

make -c $(kern_dir) m=`pwd` modules clean

rm -rf modules.order

obj-m  +=dm9dev9000c.o  //驅動程式的名字

3、make。

在驅動目錄使用命令$make,生成dm9dev9000c.ko檔案。

4、把檔案拷到檔案系統目錄,如直接放到根目錄/myfs下。看準不是核心目錄,作為初學者,本人就犯了這個低階錯誤,浪費不少時間,同時也暴露了沒理解基本的東西,欠思考。使用mkyaffs2image。製作yaffs2格式的根檔案系統,可以參考《構建根檔案系統》。

5、配置核心支援dm9000。參考《linux裝置驅動-dm9000移植》的第五點,需要注意的是,把dm9000配置成模組,即dm9000 support。不然,make uimage時會出現錯誤。

dm9dev9000c.ko。注意每次啟動都要載入一下。

8、驗證。

檢視網絡卡資訊,因為網絡卡預設是關閉的,用ifconfig eth0 up開啟網絡卡。就可以看到資訊了。

配置網絡卡ip。注意和主機在同一網段。再ping一下看能否通訊,如圖,這樣就使用的模組的方式把網絡卡一直成功了。

linux裝置驅動 DM9000移植

一 開發環境 1 核心 linux 2.6.22.6 2 jz2440 3 ubuntu9.10 二 移植過程 1 新增標頭檔案在核心目錄下的 arch arm plat s3c24xx commom smdk.c檔案中新增 if defined config dm9000 defined conf...

網絡卡(dm9000)驅動移植

網絡卡 dm9000 驅動移植 看到網上有很多的部落格分享,比如 在此,描述一下自己的製作過程 1.修改arch arm plat s3c24xx common smdk.c檔案 在包含標頭檔案的區域增加以下 在smdk devs結構體之前新增以下 if defined config dm9000 ...

DM9000網絡卡驅動移植

網絡卡驅動移植 步驟1 確定相異性 步驟2 修改 一般就是修改 iobase 和中斷 按照原理圖,其片選訊號可能是往固定段落記憶體寫資料,即是片選到這個裝置。這個也是統一編址的一種方式。根據原理圖,修改其中段引腳,把其irq修改為原理圖上面的iro.網絡卡中本來就有記憶體,當網絡卡接受到資料時候,就...