1. 程式人生 > >基於S3C2440的Linux-3.6.6移植——DM9000網絡卡驅動移植

基於S3C2440的Linux-3.6.6移植——DM9000網絡卡驅動移植

Linux-3.6.6很好的支援了DM9000,因此對於S3C2440晶片來說無需進行任何修改,甚至連menuconfig都已經預設配置了網絡卡驅動。但我們還需要設定網絡卡的MAC和IP等資訊。有許多方法可以實現網絡卡的設定,在這裡我們選擇一種比較簡單的方法——修改根檔案系統的啟動指令碼檔案rcS。在根檔案etc/init.d/rcS檔案中新增下列語句:

/sbin/ifconfig  lo  127.0.0.1

/sbin/ifconfig  eth0  hw ether  5e:f7:90:82:66:28

/sbin/ifconfig  eth0  192.168.1.234  up

route  add  default  gw  192.168.1.1

這樣就完成了網絡卡的移植。我們測試一下網絡卡。在啟動開發板時,系統會打印出類似下列資訊:

dm9000 dm9000: eth0: link down

dm9000 dm9000: eth0: link up, 100Mbps,full-duplex, lpa 0xCDE1

如果在提示符下輸入ifconfig命令,則:

[[email protected] /]#ifconfig

eth0     Link encap:Ethernet  HWaddr5E:F7:90:82:66:28

         inet addr:192.168.1.234 Bcast:192.168.1.255 Mask:255.255.255.0

         UP BROADCAST RUNNING MULTICAST MTU:1500  Metric:1

         RX packets:51 errors:0 dropped:0 overruns:0 frame:0

         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:1000

         RX bytes:5324 (5.1 KiB)  TXbytes:0 (0.0 B)

         Interrupt:51 Base address:0x2300

lo       Link encap:Local Loopback

         inet addr:127.0.0.1 Mask:255.0.0.0

         UP LOOPBACK RUNNING MTU:16436  Metric:1

         RX packets:0 errors:0 dropped:0 overruns:0 frame:0

         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:0

         RX bytes:0 (0.0 B)  TX bytes:0(0.0 B)

另外主機和開發板都可以互相ping通對方。

下面我們就簡單介紹一下DM9000網絡卡驅動。

在arch/arm/mach-s3c24xx/mach-zhaocj2440.c檔案內定義了DM9000網絡卡平臺裝置:

static struct resource zhaocj2440_dm9k_resource[]= {

       [0]= DEFINE_RES_MEM(MACH_ZHAOCJ2440_DM9K_BASE, 4),

       [1]= DEFINE_RES_MEM(MACH_ZHAOCJ2440_DM9K_BASE + 4, 4),

       [2]= DEFINE_RES_NAMED(IRQ_EINT7, 1, NULL, IORESOURCE_IRQ \

                                          |IORESOURCE_IRQ_HIGHEDGE),

};

/*

 *The DM9000 has no eeprom, and it's MAC address is set by

 *the bootloader before starting the kernel.

 */

static struct dm9000_plat_data zhaocj2440_dm9k_pdata= {

       .flags             = (DM9000_PLATF_16BITONLY |DM9000_PLATF_NO_EEPROM),

};

static struct platform_device zhaocj2440_device_eth= {

       .name             = "dm9000",

       .id          = -1,

       .num_resources      = ARRAY_SIZE(zhaocj2440_dm9k_resource),

       .resource =zhaocj2440_dm9k_resource,

       .dev        ={

              .platform_data       = &zhaocj2440_dm9k_pdata,

       },

};

並把網絡卡平臺裝置新增進平臺裝置陣列內:

static structplatform_device *zhaocj2440_devices[] __initdata = {

       ……

       &zhaocj2440_device_eth,

       ……

};

在drivers/net/ethernet/davicom/dm9000.c檔案內定義了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),

};

下面分析一下探測函式dm9000_probe:

static int__devinit

dm9000_probe(structplatform_device *pdev)

{

       struct dm9000_plat_data *pdata =pdev->dev.platform_data;

       struct board_info*db;    /* Point a board informationstructure */

       structnet_device *ndev;

       constunsigned char *mac_src;

       intret = 0;

       intiosize;

       inti;

       u32id_val;

       /*Init network device */

       //初始化網路裝置結構體net_device

       ndev= alloc_etherdev(sizeof(struct board_info));

       if(!ndev)

              return-ENOMEM;

       SET_NETDEV_DEV(ndev,&pdev->dev);

       dev_dbg(&pdev->dev,"dm9000_probe()\n");

       /*setup board info structure */

       //設定板塊資訊結構體——db

       db= netdev_priv(ndev);

       db->dev= &pdev->dev;

       db->ndev= ndev;

       //自旋鎖

       spin_lock_init(&db->lock);

       mutex_init(&db->addr_lock);

       //初始化工作佇列

       INIT_DELAYED_WORK(&db->phy_poll,dm9000_poll_work);

       //提取出DM9000網絡卡資源,即zhaocj2440_dm9k_resource

       db->addr_res= platform_get_resource(pdev, IORESOURCE_MEM, 0);   //地址

       db->data_res= platform_get_resource(pdev, IORESOURCE_MEM, 1);   //資料

       db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ,0);     //中斷

       if(db->addr_res == NULL || db->data_res == NULL ||

           db->irq_res == NULL) {

              dev_err(db->dev,"insufficient resources\n");

              ret =-ENOENT;

              gotoout;

       }

       //獲取網絡卡中斷資源

       db->irq_wake= platform_get_irq(pdev, 1);

       if(db->irq_wake >= 0) {

              dev_dbg(db->dev,"wakeup irq %d\n", db->irq_wake);

              //申請網絡卡中斷,中斷函式為dm9000_wol_interrupt

              ret= request_irq(db->irq_wake, dm9000_wol_interrupt,

                              IRQF_SHARED, dev_name(db->dev), ndev);

              if(ret) {

                     dev_err(db->dev,"cannot get wakeup irq (%d)\n", ret);

              }else {

                     /*test to see if irq is really wakeup capable */

                     ret= irq_set_irq_wake(db->irq_wake, 1);

                     if(ret) {

                            dev_err(db->dev,"irq %d cannot set wakeup (%d)\n",

                                   db->irq_wake, ret);

                            ret = 0;

                     } else {

                            irq_set_irq_wake(db->irq_wake,0);

                            db->wake_supported = 1;

                     }

              }

       }

       //申請網絡卡地址所需的記憶體空間

       iosize= resource_size(db->addr_res);

       db->addr_req= request_mem_region(db->addr_res->start, iosize,

                                     pdev->name);

       if(db->addr_req == NULL) {

              dev_err(db->dev,"cannot claim address reg area\n");

              ret= -EIO;

              gotoout;

       }

       //地址記憶體空間對映

       db->io_addr= ioremap(db->addr_res->start, iosize);

       if(db->io_addr == NULL) {

              dev_err(db->dev,"failed to ioremap address reg\n");

              ret= -EINVAL;

              gotoout;

       }

       //申請網絡卡資料所需的記憶體空間

       iosize= resource_size(db->data_res);

       db->data_req= request_mem_region(db->data_res->start, iosize,

                                     pdev->name);

       if(db->data_req == NULL) {

              dev_err(db->dev,"cannot claim data reg area\n");

              ret= -EIO;

              gotoout;

       }

       //資料記憶體空間對映

       db->io_data= ioremap(db->data_res->start, iosize);

       if (db->io_data == NULL) {

              dev_err(db->dev,"failed to ioremap data reg\n");

              ret= -EINVAL;

              gotoout;

       }

       /*fill in parameters for net-dev structure */

       //設定網路裝置結構體——ndev

       ndev->base_addr= (unsigned long)db->io_addr;

       ndev->irq       = db->irq_res->start;

       /*ensure at least we have a default set of IO routines */

       //確保至少有一種IO路由方式,即先設定一種預設的IO路由

       dm9000_set_io(db,iosize);

       /*check to see if anything is being over-ridden */

       /*檢查是否可以替代剛才設定的IO路由,由於我們在zhaocj2440_dm9k_pdata結構體內的flags元素定義了DM9000_PLATF_16BITONLY,所以預設的IO路由方式會被替代,即執行dm9000_set_io(db, 2);*/

       if(pdata != NULL) {

              /*check to see if the driver wants to over-ride the

               * default IO width */

              if(pdata->flags & DM9000_PLATF_8BITONLY)

                     dm9000_set_io(db,1);

              if(pdata->flags & DM9000_PLATF_16BITONLY)

                     dm9000_set_io(db,2);

              if(pdata->flags & DM9000_PLATF_32BITONLY)

                     dm9000_set_io(db,4);

              /*check to see if there are any IO routine

               * over-rides */

              if(pdata->inblk != NULL)

                     db->inblk= pdata->inblk;

              if(pdata->outblk != NULL)

                     db->outblk= pdata->outblk;

              if(pdata->dumpblk != NULL)

                     db->dumpblk= pdata->dumpblk;

              db->flags= pdata->flags;

       }

#ifdef CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL

       db->flags|= DM9000_PLATF_SIMPLE_PHY;

#endif

       //網絡卡復位

       dm9000_reset(db);

       /*try multiple times, DM9000 sometimes gets the read wrong */

       //多次讀取DM9000的ID,以確保能夠正確識別DM9000

       for (i = 0; i < 8; i++) {

              id_val  = ior(db, DM9000_VIDL);

              id_val |= (u32)ior(db,DM9000_VIDH) << 8;

              id_val |= (u32)ior(db, DM9000_PIDL)<< 16;

              id_val |=(u32)ior(db, DM9000_PIDH) << 24;

              //判斷讀取的值是否為0x90000A46

              if(id_val == DM9000_ID)

                     break;

              dev_err(db->dev,"read wrong id 0x%08x\n", id_val);

       }

       if(id_val != DM9000_ID) {

              dev_err(db->dev,"wrong id: 0x%08x\n", id_val);

              ret= -ENODEV;

              gotoout;

       }

       /*Identify what type of DM9000 we are working on */

       //讀取CHIPR暫存器,獲得type資訊

       id_val= ior(db, DM9000_CHIPR);

       dev_dbg(db->dev,"dm9000 revision 0x%02x\n", id_val);

       switch(id_val) {

       caseCHIPR_DM9000A:

              db->type= TYPE_DM9000A;

              break;

       caseCHIPR_DM9000B:

              db->type= TYPE_DM9000B;

              break;

       default:

              dev_dbg(db->dev,"ID %02x => defaulting to DM9000E\n", id_val);

              db->type= TYPE_DM9000E;

       }

       /*dm9000a/b arecapable of hardware checksum offload */

       if(db->type == TYPE_DM9000A|| db->type == TYPE_DM9000B) {

              ndev->hw_features= NETIF_F_RXCSUM | NETIF_F_IP_CSUM;

              ndev->features|= ndev->hw_features;

       }

       /*from this point we assume that we have found a DM9000 */

       /*driver system function */

       //設定乙太網卡裝置,即把有關乙太網裝置的資料賦值給ndev

       ether_setup(ndev);

       ndev->netdev_ops  = &dm9000_netdev_ops;      //網絡卡裝置操作集

       ndev->watchdog_timeo  = msecs_to_jiffies(watchdog);

       ndev->ethtool_ops  = &dm9000_ethtool_ops;      //乙太網卡操作集

       db->msg_enable       = NETIF_MSG_LINK;

       db->mii.phy_id_mask  = 0x1f;

       db->mii.reg_num_mask= 0x1f;

       db->mii.force_media  = 0;

       db->mii.full_duplex  = 0;

       db->mii.dev         =ndev;

       db->mii.mdio_read    = dm9000_phy_read;

       db->mii.mdio_write   = dm9000_phy_write;

       //通過不同方式讀取網絡卡的MAC

       mac_src= "eeprom";

       /*try reading the node address from the attached EEPROM */

       //從eeprom中讀取MAC

       for(i = 0; i < 6; i += 2)

              dm9000_read_eeprom(db,i / 2, ndev->dev_addr+i);

       /*如果從eeprom中讀取MAC失敗,則從平臺裝置中讀取MAC,即提取出zhaocj2440_dm9k_pdata結構中的dev_addr陣列元素*/

       if(!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {

              mac_src= "platform data";

              memcpy(ndev->dev_addr,pdata->dev_addr, 6);

       }

       /*如果到目前為止,還沒有讀取到正確的MAC,則從DM9000晶片的PAR暫存器內提取出MAC*/

       if(!is_valid_ether_addr(ndev->dev_addr)) {

              /*try reading from mac */

              mac_src= "chip";

              for (i = 0; i < 6; i++)

                     ndev->dev_addr[i] =ior(db, i+DM9000_PAR);

       }

       /*如果上述方法都不行,則MAC值最終是要通過ifconfig來確定。但由於現在還沒有執行ifconfig命令,因此係統在啟動初始化的過程中,要隨機分配MAC。*/

       if(!is_valid_ether_addr(ndev->dev_addr)) {

              dev_warn(db->dev,"%s: Invalid ethernet MAC address. Please "

                      "set using ifconfig\n",ndev->name);

              eth_hw_addr_random(ndev);

              mac_src= "random";

       }

       //把ndev儲存為平臺裝置pdev的私有資料,以後可以用platform_get_drvdata獲取該資料

       platform_set_drvdata(pdev,ndev);

       //註冊網路裝置

       ret= register_netdev(ndev);

       //在系統啟動過程中,列印網絡卡相關資料

       if(ret == 0)

              printk(KERN_INFO"%s: dm9000%c at %p,%p IRQ %d MAC: %pM (%s)\n",

                     ndev->name,dm9000_type_to_char(db->type),

                     db->io_addr, db->io_data, ndev->irq,

                     ndev->dev_addr,mac_src);

       return0;

out:

       dev_err(db->dev,"not found (%d).\n", ret);

       dm9000_release_board(pdev,db);

       free_netdev(ndev);

       returnret;

}

在dm9000_probe函式內定義了dm9000_netdev_ops:

static const struct net_device_opsdm9000_netdev_ops = {

       .ndo_open             = dm9000_open,           //開啟裝置

       .ndo_stop              = dm9000_stop,            //關閉裝置

       .ndo_start_xmit             = dm9000_start_xmit,           //開始傳送資料

       .ndo_tx_timeout            = dm9000_timeout,              //傳送超時

       .ndo_set_rx_mode  = dm9000_hash_table,          //設定多播列表

       .ndo_do_ioctl         = dm9000_ioctl,            //io操作函式

       .ndo_change_mtu          = eth_change_mtu,        //改變mtu

       .ndo_set_features    = dm9000_set_features,

       .ndo_validate_addr = eth_validate_addr,

       .ndo_set_mac_address    = eth_mac_addr,

#ifdef CONFIG_NET_POLL_CONTROLLER

       .ndo_poll_controller      = dm9000_poll_controller,

#endif

};

我們分析幾個重要的回撥函式。

當執行ifconfig命令時,會呼叫dm9000_open函式,以開啟網路介面

static int

dm9000_open(struct net_device *dev)

{

       board_info_t*db = netdev_priv(dev);

       unsignedlong irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;

       if(netif_msg_ifup(db))

              dev_dbg(db->dev,"enabling %s\n", dev->name);

       /*If there is no IRQ type specified, default to something that

        * may work, and tell the user that this is aproblem */

       if(irqflags == IRQF_TRIGGER_NONE)

              dev_warn(db->dev,"WARNING: no IRQ resource flags set.\n");

       irqflags|= IRQF_SHARED;

       /*GPIO0 on pre-activate PHY, Reg 1Fis not set by reset */

       //將GPR暫存器的第0位清零,啟用內部PHY

       iow(db,DM9000_GPR, 0);   /* REG_1F bit0 activate phyxcer */

       mdelay(1);/* delay needs by DM9000B */

       /*Initialize DM9000 board */

       dm9000_reset(db);        //復位DM9000

       //初始化DM9000,主要就是配置DM9000的內部暫存器

       dm9000_init_dm9000(dev);        

       //註冊中斷,中斷函式為dm9000_interrupt,該中斷負責收發資料

       if(request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))

              return-EAGAIN;

       /*Init driver variable */

       db->dbug_cnt= 0;

       //檢測mii介面的狀態

       mii_check_media(&db->mii,netif_msg_link(db), 1);

       //允許上層協議使用該裝置,開啟發送佇列

       netif_start_queue(dev);

       /*在dm9000_probe函式中,使用INIT_DELAYED_WORK初始化了一個工作佇列,現在就呼叫它,即執行dm9000_poll_work函式,用以檢測並顯示網路資訊*/

       dm9000_schedule_poll(db);

       return 0;

}

關閉網絡卡裝置函式dm9000_stop:

static int

dm9000_stop(struct net_device *ndev)

{

       board_info_t*db = netdev_priv(ndev);

       if(netif_msg_ifdown(db))

              dev_dbg(db->dev,"shutting down %s\n", ndev->name);

       //終止phy_poll佇列中被延遲的任務

       cancel_delayed_work_sync(&db->phy_poll);

       //關閉傳送佇列

       netif_stop_queue(ndev);

       //載波丟失

       netif_carrier_off(ndev);

       /*free interrupt */

       free_irq(ndev->irq,ndev);            //釋放中斷

       dm9000_shutdown(ndev);            //關閉網絡卡

       return0;

}

傳送資料函式dm9000_start_xmit:

static int

dm9000_start_xmit(struct sk_buff *skb,struct net_device *dev)

{

       unsignedlong flags;

       board_info_t*db = netdev_priv(dev);

       dm9000_dbg(db,3, "%s:\n", __func__);

       if(db->tx_pkt_cnt > 1)

              returnNETDEV_TX_BUSY;

       //獲得自旋鎖

       spin_lock_irqsave(&db->lock,flags);

       /*Move data to DM9000 TX RAM */

       //根據io操作資料寬度,來設定MWCMD,即填充資料完畢後指標加1還是加2

       writeb(DM9000_MWCMD,db->io_addr);

       //將資料從sk_buff中複製到DM9000內部發送RAM(TX_Buffer)中

       (db->outblk)(db->io_data,skb->data, skb->len);

       dev->stats.tx_bytes +=skb->len;          //統計傳送的位元組數

       db->tx_pkt_cnt++;        //傳送計數

       /*TX control: First packet immediately send, second packet queue */

       if(db->tx_pkt_cnt == 1) {

              //計數值為1,立即傳送

              dm9000_send_packet(dev,skb->ip_summed, skb->len);

       } else {

              /* Secondpacket */

              //如果是第2個數據包,加入佇列以後,停止傳送

              db->queue_pkt_len= skb->len;

              db->queue_ip_summed= skb->ip_summed;

              netif_stop_queue(dev);         

       }

       //解自旋鎖

       spin_unlock_irqrestore(&db->lock,flags);

       /*free this SKB */

       dev_kfree_skb(skb);

       returnNETDEV_TX_OK;

}

dm9000_start_xmit函式只負責傳送一個數據包,那麼如何傳送第二個資料包呢?網絡卡又如何接收資料呢?還記得在dm9000_open函式內,申請了一箇中斷,中斷函式為dm9000_interrupt,該中斷就是負責接收資料和傳送多個數據包的任務:

static irqreturn_t dm9000_interrupt(intirq, void *dev_id)

{

       struct net_device *dev = dev_id;

       board_info_t *db = netdev_priv(dev);

       int int_status;

       unsigned long flags;

       u8 reg_save;

       dm9000_dbg(db, 3, "entering%s\n", __func__);

       /* A realinterrupt coming */

       /*holders of db->lock must always block IRQs */

       //獲取自旋鎖

       spin_lock_irqsave(&db->lock,flags);

       /*Save previous register address */

       //儲存以前的暫存器地址

       reg_save= readb(db->io_addr);

       /*Disable all interrupts */

       //禁止所有中斷

       iow(db,DM9000_IMR, IMR_PAR);

       /*Got DM9000 interrupt status */

       //得到中斷狀態,即是何種原因引起的中斷

       int_status= ior(db, DM9000_ISR);      /* Got ISR */

       iow(db,DM9000_ISR, int_status);       /* ClearISR status */

       if(netif_msg_intr(db))

              dev_dbg(db->dev,"interrupt status %02x\n", int_status);

       /*Received the coming packet */

       //該中斷為接收資料中斷

       if(int_status & ISR_PRS)

              dm9000_rx(dev);

       /*Trnasmit Interrupt check */

       //該中斷為傳送資料結束中斷

       if(int_status & ISR_PTS)

              dm9000_tx_done(dev,db);

       if(db->type != TYPE_DM9000E) {

              if(int_status & ISR_LNKCHNG) {

                     /*fire a link-change request */

                     schedule_delayed_work(&db->phy_poll,1);

              }

       }

       /*Re-enable interrupt mask */

       //開啟中斷

       iow(db,DM9000_IMR, db->imr_all);

       /*Restore previous register address */

       writeb(reg_save,db->io_addr);

       spin_unlock_irqrestore(&db->lock,flags);

       returnIRQ_HANDLED;

}

從上面函式的分析可以看出,當是接收資料觸發的中斷時,會呼叫dm9000_rx函式來接收資料,然後呼叫netif_rx函式把資料傳輸到上層網路協議中;而當一個數據包傳送完畢後也會觸發該中斷,並呼叫dm9000_tx_done函式。在該函式內,如果判斷還有待發送的資料則呼叫執行dm9000_send_packet函式再次傳送資料。例如我們要傳送兩個資料包,則首先呼叫dm9000_start_xmit函式傳送第一個資料包,當傳送完畢後觸發中斷dm9000_interrupt,並呼叫dm9000_tx_done函式傳送第二個資料包,至此兩個資料包都發送了出去。

相關推薦

基於S3C2440的Linux-3.6.6移植——DM9000驅動移植

Linux-3.6.6很好的支援了DM9000,因此對於S3C2440晶片來說無需進行任何修改,甚至連menuconfig都已經預設配置了網絡卡驅動。但我們還需要設定網絡卡的MAC和IP等資訊。有許多方法可以實現網絡卡的設定,在這裡我們選擇一種比較簡單的方法——修改根檔案系

U-Boot1.1.6移植DM9000

    巨集定義CONFIG_DRIVER_DM9000為1表示配置使用DM9000網絡卡,u-boot編譯時會將DM9000相關的驅動編譯進去。其中0x20000000是DM9000的基址(BANK4),由於DM9000只有一條地址線CMD(LADDR2,見圖3.1)用於區別是資料還是地址(CMD為低時資料

基於Exynos4412 cortex A9開發板的無線驅動移植過程

移植無線網絡卡的驅動: 準備工作: 1.無線網絡卡 2.首先在這個官網上[www.realtek.com.tw](無線網絡卡),下載相應網絡卡的驅動,本次下載的名稱為: 0001RTL8188

CentOS 6.5 安裝無線驅動實現無線上網

http://www.linuxidc.com/Linux/2014-10/108418.htm 一、檢視是否安裝了無線網絡卡驅動 出現以上的結果證明你的沒有安裝,不能無線上網。如果你已經裝了網絡卡驅動並能實現無線上網就會有如下顯示: 二、檢視無線網絡卡的型號  [[

centos 6.2安裝ar8152驅動

剛安裝好來centos 6.2, 發現無法聯網,我下意識反應:沒網絡卡驅動。真的很蛋疼。好吧,只能自己安裝了。 由於不能聯網,如果在安裝網絡卡驅動過程中發現有依賴包沒有找到,可以利用yum在本地源搜尋安裝,具體檢視: 1、檢視網絡卡型號 lspci | grep Ethernet   lspci | g

U-Boot移植DM9000(附:程式、原始碼、測試程式)

  U-Boot移植DM9000網絡卡 ——西伯利亞的風     根據書《嵌入式Linux應用開發完全手冊》移植網絡卡驅動,對於Jz2440開發板好像並不適用,Jz2440開發板使用的是DM9000網絡卡,已經不是書上講的CS8900網絡卡了。DM9000網絡卡與CS890

l(轉)Linux DM9000驅動程式完全分析

[置頂] Linux DM9000網絡卡驅動程式完全分析 分類: Linux裝置驅動程式第三版學習筆記 2011-02-26 16:11 3513人閱讀 評論(34) 收藏 舉報 說明1:本文分析基於核心原始碼版本為linux-2

初識Linux 驅動移植 之 dm9621驅動移植

概述 將kernel移植到開發板並能正常載入和啟動核心後,發現網絡卡並沒有工作,因此將網絡卡作為第一個移植的實踐。這篇文章用於記錄移植dm9621網絡卡過程中遇到的問題以及如何定位問題並嘗試解決。 配置核心 在找到dm9621網絡卡驅動的原始碼後,需要將其新增

kali 3.14 安裝RT3070 無線驅動

最近對無線安全比較感興趣,買了個無線網絡卡,RT3070的晶片,去官網下了個linux的驅動,編譯安裝 rar, bunzip2, tar解壓,隨便說一下,tar解壓時需要自己重新命名,改為.tar的字尾 修改os/linux/ 下的config 檔案 # Support

WIFI驅動移植

移植網絡卡驅動相對比較簡單,但是得注意一下USB無線網絡卡的VID和PID。下面我們來講解具體移植過程 我用的無線網絡卡是騰達W311M 無線網絡卡,官網驅動下載地址:http://www.tenda

rt3070 usb無線驅動移植

核心配置: Networking  --->     <*>   Generic IEEE 802.11 Networking Stack Device Drivers  --->     Generic Driver Options  ---&g

嵌入式Linux開發板WIFI無線驅動移植

本文所用開發板:tiny4412,當然也可以在jz2440上實現。 嵌入式中裝置想要聯網,無非就 有線和無線 兩種方式。 有線就插上網線,沒什麼好說的;無線的話一種是將WIFI模組整合焊接在板子上,另一種是WIFI模組以USB的方式接到板子上。 本次使用的

centos 6.4系統雙繫結配置詳解

文章出處:http://blog.chinaunix.net/uid-29179844-id-4214001.html Linux雙網絡卡繫結實現就是使用兩塊網絡卡虛擬成為一塊網絡卡(需要交換機支援),這個聚合起來的裝置看起來是一個單獨的乙太網介面裝置,通俗點講就是兩

Centos 6.5 初始安裝無驅動解決方法詳細

我是Linux方面的菜鳥,但這個問題足足困擾了我5天,終於圓滿解決,於是決定整理下,作為自己學習程式設計的第一篇部落格,希望能給遇到同樣問題的童鞋一點幫助……一、問題的現象:安裝完後不能上網,/etc/sysconfig/network-scripts/目錄下ifcfg打頭的

debian8.6 jessie 安裝 驅動問題

     我選擇的是U 盤做啟動盤安裝debian8.6。     下載debian 8.6官方版之後安裝時提示缺失的韌體是:rtl_nic/rtl8168g-2.fw; 這時需要在debian官網上

Esxi 6.0 -- Esxi 5.0 新增驅動

           et-e1000e:Obsolete- Driver for Intel I217/I218/82579LM/82574L net-tulip: DECchip 2114

CentOS 6.4下 BCM4312 802.11b/g無線驅動安裝

     之前看過官方的教程,發現根本就沒有用,我按照上面所述進行安裝,但是後面還是沒有無線的訊號,這是我找的一篇關於BCM4312的文章,寫的很簡單,但是很實用! 對幫助我的這篇文章的作者表示感謝! 使用命令檢測網絡卡 lspci | grep Network   為“

RedHat 6 VMware克隆後修改方法

通常為了節省時間,在VMware中安裝一套Linux後,會直接克隆一份出來使用。但在克隆REDHAT 6後,會發現網絡卡名稱發生變化,比如eth0會變為eth1,下面介紹下克隆後的redhat 6,如何修改主機名、IP地址和網絡卡名稱。 修改主機名(共2步) hostnam

CentOS 6.5 BCM43142 80211無線驅動安裝

沒事折騰了一下雙系統,在Windows7之外又裝了個CentOS 6.5,裝完之後發現沒有無線網絡卡驅動,不能連WIFI。於是裝驅動又折騰了好幾個小時。。。這裡記錄一下 1、檢視本機的驅動資訊 使用iwconfig發現本機沒有無線網絡卡驅動: [r

移植u-boot-2015.07-rc3之修改程式碼支援DM9000(七)

目前的u-boot啟動後有如下資訊: Net:   CS8900-0 Error: CS8900-0address not set. 板子上的是DM9000不是CS8900,網絡卡模組肯定是錯誤的嘛。看到這裡,你應該有了熟悉的思路,grep "Net:" * -nR查詢網絡