日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动

發布時間:2023/12/10 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習交流加

  • 個人qq:
    1126137994
  • 個人微信:
    liu1126137994
  • 學習交流資源分享qq群:
    962535112

之前已經把uboot,內核,文件系統,都移植好了,今天開始我們把第二期寫的Linux2.6.22.6內核的驅動程序全部移植到我們新3.4.2內核中去。首先移植網卡驅動程序吧,因為,我們后面需要用到網絡文件系統來更簡便的學習。

文章目錄

    • 1 移植DM9000網卡驅動程序概覽
    • 2.移植內核自帶的網卡驅動程序
    • 3.移植最新網卡驅動程序(自己寫的網卡驅動程序)的步驟
    • 4.最后,我們來設置一下開機直接掛載網絡根文件系統:

1 移植DM9000網卡驅動程序概覽

一.移植的步驟:

  • 編譯
  • 解決錯誤
    2.1 頭文件不對:去掉或改名
    2.2 宏不對:改名使用新的宏
    2.3 有些函數沒有了:改名使用新函數
  • 2.移植內核自帶的網卡驅動程序

    在移植之前,首先我們來看一下mini2440(對應的機器ID為:set machid 7CF)中,是如何支持dm9000網卡的。
    進入到入口函數,找到結構體:

    static struct platform_driver dm9000_driver = {.driver = {.name = "dm9000",.owner = THIS_MODULE,.pm = &dm9000_drv_pm_ops,},.probe = dm9000_probe,.remove = __devexit_p(dm9000_drv_remove), };

    一般是通過.name這個成員進行匹配的,搜索字符串“dm9000”,找到如下結構體(在平臺文件中:arch\arm\mach-s3c24xx\Mach-mini2440.c):

    static struct platform_device mini2440_device_eth = {.name = "dm9000",.id = -1,.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),.resource = mini2440_dm9k_resource,.dev = {.platform_data = &mini2440_dm9k_pdata,}, };

    然后搜索結構體mini2440_device_eth,找到:

    static struct platform_device *mini2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_rtc,&s3c_device_usbgadget,&mini2440_device_eth, //在這里&mini2440_led1,&mini2440_led2,&mini2440_led3,&mini2440_led4,&mini2440_button_device,&s3c_device_nand,&s3c_device_sdi,&s3c_device_iis,&uda1340_codec,&mini2440_audio,&samsung_asoc_dma, };

    然后再搜索:mini2440_devices,找到:

    platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));

    這就是把結構體mini2440_devices添加到內核,里面的關于網卡的結構在里面,最終匹配驅動程序,就可以使用驅動程序了。
    (這就是所謂的平臺設備平臺驅動的東西了,把可變的東西抽象出來放到平臺相關的文件中定義,而我們的驅動程序,基本上是不需要改變的,它是穩定的內容,我們移植的時候,只需要把平臺層可變的相關結構體加上,需要修改的資源,進行修改就可以了)。

    而我們用的是smdk2440(對應的機器ID為:set machid 16a),然后我在Mach-smdk2440.c中添加以下函數:

    /* lyy 以下為添加* The DM9000 has no eeprom, and it's MAC address is set by* the bootloader before starting the kernel.*//* DM9000AEP 10/100 ethernet controller */#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)static struct resource smdk2440_dm9k_resource[] = {[0] = {.start = MACH_SMDK2440_DM9K_BASE,.end = MACH_SMDK2440_DM9K_BASE + 3,.flags = IORESOURCE_MEM},[1] = {.start = MACH_SMDK2440_DM9K_BASE + 4,.end = MACH_SMDK2440_DM9K_BASE + 7,.flags = IORESOURCE_MEM},[2] = {.start = IRQ_EINT7,.end = IRQ_EINT7,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,} };static struct dm9000_plat_data smdk2440_dm9k_pdata = {.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), };static struct platform_device smdk2440_device_eth = {.name = "dm9000",.id = -1,.num_resources = ARRAY_SIZE(smdk2440_dm9k_resource),.resource = smdk2440_dm9k_resource,.dev = {.platform_data = &smdk2440_dm9k_pdata,}, };/* lyy:以上為添加 */

    在結構體smdk2440_devices中添加網卡成員:

    static struct platform_device *smdk2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,&smdk2440_device_eth, /* lyy:添加 */ };

    添加頭文件:

    #include <linux/dm9000.h> /* lyy:添加 */

    然后重新編譯內核。成功。燒寫新內核:
    nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000

    然后掛載網絡文件系統(掛載之前設置ip,我的是自動設置ip了,所以就shenglve):
    mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt

    成功掛載網絡文件系統。

    3.移植最新網卡驅動程序(自己寫的網卡驅動程序)的步驟

    有時候,內核自帶的網卡驅動程序比較老,而我們的硬件有可能比較新,那么我們就不能使用內核的網卡驅動程序了,就需要去移植最新的網卡驅動程序,那么這種類型的,又該如何移植呢?

    首先,移植的步驟就主要是改錯誤的過程,錯誤較多,這里就不一一列出了(如若需要該網卡驅動程序,可以加最底下我的聯系方式),假設我們已經改好的網卡驅動程序為:dm9dev9000c.c,編譯也沒有錯誤。我們將它拷貝到內核相關目錄:
    cp dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/
    修改該目錄Makefile文件:

    # # Makefile for the Davicom device drivers. ##obj-$(CONFIG_DM9000) += dm9000.o obj-$(CONFIG_DM9000) += dm9dev9000c.o

    然后重新編譯內核。燒寫,看看網卡是否可以正常使用,以及是否可以掛載網絡根文件系統。
    nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
    mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
    可以成功掛載網絡根文件系統,所以網卡移植是成功的。

    4.最后,我們來設置一下開機直接掛載網絡根文件系統:

    uboot中設置:set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.101:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.104:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off

    ip=192.168.1.104:為單板ip,192.168.1.101:為服務器ip,192.168.1.1為網關,255.255.255.0為子網掩碼

    然后啟動內核:nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
    這樣就可以直接開機啟動網絡根文件系統了。以后開發就更加方便了。

    想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
    qq:1126137994
    微信:liu1126137994
    可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。

    總結

    以上是生活随笔為你收集整理的【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。