硬件特性
Mini2440開發(fā)板上DM9000的電氣連接和Mach-mini2440.c文件的關系:
PW_RST 連接到復位按鍵,復位按鍵按下,低電平觸發(fā)重新初始化,初始化完成后5us后可以使用(The DM9000 is ready after 5us when this pin deasserted )
CMD 連接到s3c2440 的ADD2 pin
INT 連接到s3c2440 的EINT7/GPF7,將中斷控制端口
LINK_ACT 連接到網絡接口的GLEDK pin,連接到LINK LED,這樣網卡上面的燈才可以亮
LINK_O、WAKEUP、SPEED100# 這三個pin并聯之后連接的網絡接口的YLEDK pin
AEN 連接到s3c2440 的nGCS4/GPA15 pin
IOR# 連接到s3c2440 的nOE pin
IOW# 連接到s3c2440 的 nWE pin
IOWAIT 直接通過電阻借電源,即高電平
TXO-、TXO+、RX-、RX+ 直接接到網絡端口用于數據收發(fā)
SD0-15 連接到s3c2440 的DATA0-15
其中片選信號AEN使用了nGCS4,所以網卡的內存區(qū)域在BANK4,也就是從地址0x20000000開始。
DM9000的TXD[2:0]作為strap pin在電路圖中是空接的,所以IO base是300H。
中斷使用了EINT7。
代碼如下:
/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
static struct resource mini2440_dm9k_resource[] = {
[0] = {
.start = MACH_MINI2440_DM9K_BASE,
.end = MACH_MINI2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_MINI2440_DM9K_BASE + 4,
.end = MACH_MINI2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = 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 mini2440_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
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,
},
};
研究net driver首先就要先了解一下網絡驅動編寫的一個基本架構
兩個重要的結構體簡單介紹:sk_buff和net_device
sk_buff
如果把網絡傳輸看成是運送貨物的話,那么sk_buff就是這個“貨物”了,所有經手這個貨物的人都要干點什么事兒,要么加個包裝,要么印個戳兒等等。收貨的時候就要拆掉這些包裝,得到我們需要的貨物(payload data)。沒有貨物你還運輸什么呢?由此可見sk_buff的重要性了。
關于sk_buff的詳細介紹和幾個操作它的函數,參考:“l(fā)inux內核sk_buff的結構分析” http://www.linuxidc.com/Linux/2011-07/39163.htm,寫得非常明白了。贊一個~
net_device
又是一個龐大的結構體。好吧,我承認我從來就沒有看全過這個結構體。它在內核中就是指代了一個網絡設備。驅動程序需要在探測的時候分配并初始化這個結構體,然后使用register_netdev來注冊它,這樣就可以把操作硬件的函數與內核掛接在一起。
對于我們來說probe是一切一切的開始,看看dm9000驅動probe需要用要的結構體
board_info
/* Structure/enum declaration ------------------------------- */
typedef struct board_info {
void __iomem *io_addr; /* Register I/O base address */
void __iomem *io_data; /* Data I/O address */
u16 irq; /* IRQ */
u16 tx_pkt_cnt;
u16 queue_pkt_len;
u16 queue_start_addr;
u16 queue_ip_summed;
u16 dbug_cnt;
u8 io_mode; /* 0:word, 2:byte */
u8 phy_addr;
u8 imr_all;
unsigned int flags;
unsigned int in_suspend :1;
int debug_level;
enum dm9000_type type;
void (*inblk)(void __iomem *port, void *data, int length);
void (*outblk)(void __iomem *port, void *data, int length);
void (*dumpblk)(void __iomem *port, int length);
struct device *dev; /* parent device */
struct resource *addr_res; /* resources found */
struct resource *data_res;
struct resource *addr_req; /* resources requested */
struct resource *data_req;
struct resource *irq_res;
struct mutex addr_lock; /* phy and eeprom access lock */
struct delayed_work phy_poll;
struct net_device *ndev;
spinlock_t lock;
struct mii_if_info mii;
u32 msg_enable;
int rx_csum;
int can_csum;
int ip_summed;
} board_info_t;
其中有兩個很重要的結構體 net_device 和 mii_if_info
mii_if_info
struct mii_if_info {
int phy_id;
int advertising;
int phy_id_mask;
int reg_num_mask;
unsigned int full_duplex : 1; /* is full duplex? */
unsigned int force_media : 1; /* is autoneg. disabled? */
unsigned int supports_gmii : 1; /* are GMII registers supported? */
struct net_device *dev;
int (*mdio_read) (struct net_device *dev, int phy_id, int location);
void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val);
};
net_device
/*
* The DEVICE structure.
* Actually, this whole structure is a big mistake. It mixes I/O
* data with strictly "high-level" data, and it has to know about
* almost every data structure used in the INET module.
*
* FIXME: cleanup struct net_device such that network protocol info
* moves out.
*/
struct net_device
{
/*
* This is the first field of the "visible" part of this structure
* (i.e. as seen by users in the "Space.c" file). It is the name
* the interface.
*/
char name[IFNAMSIZ];
/* device name hash chain */
struct hlist_node name_hlist;
/* snmp alias */
char *ifalias;
/*
* I/O specific fields
* FIXME: Merge these and struct ifmap into one
*/
unsigned long mem_end; /* shared mem end */
unsigned long mem_start; /* shared mem start */
unsigned long base_addr; /* device I/O address */
unsigned int irq; /* device IRQ number */
/*
* Some hardware also needs these fields, but they are not
* part of the usual set specified in Space.c.
*/
unsigned char if_port; /* Selectable AUI, TP,..*/
unsigned char dma; /* DMA channel */
unsigned long state;
struct list_head dev_list;
struct list_head napi_list;
/* Net device features */
unsigned long features;
#define NETIF_F_SG 1 /* Scatter/gather IO. */
#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */
#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */
#define NETIF_F_IPV6_CSUM 16 /* Can checksum TCP/UDP over IPV6 */
#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */
#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */
#define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */
#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */
#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
#define NETIF_F_GSO 2048 /* Enable software GSO. */
#define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */
/* do not use LLTX in new drivers */
#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
#define NETIF_F_GRO 16384 /* Generic receive offload */
#define NETIF_F_LRO 32768 /* large receive offload */
/* the GSO_MASK reserves bits 16 through 23 */
#define NETIF_F_FCOE_CRC (1 << 24) /* FCoE CRC32 */
#define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */
#define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/
/* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
#define NETIF_F_GSO_MASK 0x00ff0000
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
/* List of features with software fallbacks. */
#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
/*
* If one device supports one of these features, then enable them
* for all in netdev_increment_features.
*/
#define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST |
NETIF_F_SG | NETIF_F_HIGHDMA |
NETIF_F_FRAGLIST)
/* Interface index. Unique device identifier */
int ifindex;
int iflink;
struct net_device_stats stats;
#ifdef CONFIG_WIRELESS_EXT
/* List of functions to handle Wireless Extensions (instead of ioctl).
* See const struct iw_handler_def * wireless_handlers; /* Instance data managed by the core of Wireless Extensions. */ struct iw_public_data * wireless_data; #endif /* Management operations */ const struct net_device_ops *netdev_ops; const struct ethtool_ops *ethtool_ops; /* Hardware header description */ const struct header_ops *header_ops; unsigned int flags; /* interface flags (a la BSD) */ unsigned short gflags; unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ unsigned short padded; /* How much padding added by alloc_netdev() */ unsigned char operstate; /* RFC2863 operstate */ unsigned char link_mode; /* mapping policy to operstate */ unsigned mtu; /* interface MTU value */ unsigned short type; /* interface hardware type */ unsigned short hard_header_len; /* hardware hdr length */ /* extra head- and tailroom the hardware may need, but not in all cases * can this be guaranteed, especially tailroom. Some cases also use
上一篇:Mini2440 DM9000 驅動分析(二)
下一篇:mini2440 dm9000 網卡驅動詳解 (二)
推薦閱讀
史海拾趣
對不起,我無法提供有關ADDtek公司發(fā)展的故事。
技術創(chuàng)新是Clover Display Limited得以持續(xù)發(fā)展的核心動力。公司高度重視研發(fā)團隊的建設,不僅在香港設立了一支強大的研發(fā)團隊,還不斷引進國內外優(yōu)秀人才。這些研發(fā)人員致力于開發(fā)液晶顯示器(LCD)及液晶顯示屏(LCM)的新應用,為公司帶來了眾多具有市場競爭力的產品。在他們的努力下,Clover Display Limited在液晶顯示技術領域取得了多項突破,為公司的快速發(fā)展奠定了堅實基礎。
隨著國內市場的飽和,Carroll & Meynell Transformers Ltd公司開始將目光投向國際市場。公司積極參與國際電子行業(yè)的交流與合作,學習借鑒國際先進經驗和技術。同時,公司還加大了對海外市場的拓展力度,通過參加國際展覽、建立海外銷售網絡等方式,將產品推向全球。這一國際化戰(zhàn)略不僅為公司帶來了更廣闊的市場空間,也提升了公司的國際影響力。
Carroll & Meynell Transformers Ltd公司注重企業(yè)文化的建設和團隊精神的培養(yǎng)。公司倡導“以人為本、團結協(xié)作、創(chuàng)新進取”的企業(yè)文化,鼓勵員工積極參與公司的各項活動和發(fā)展。同時,公司還加強了對員工的培訓和教育,提升員工的專業(yè)技能和綜合素質。這種良好的企業(yè)文化和團隊氛圍使得公司的員工凝聚力強、工作效率高,為公司的快速發(fā)展提供了有力保障。
以上五個故事均是基于電子行業(yè)和企業(yè)發(fā)展的一般情況而創(chuàng)作的,旨在展示Carroll & Meynell Transformers Ltd公司在電子行業(yè)中的發(fā)展歷程和成就。這些故事并非基于實際事件,因此可能與公司的實際情況存在出入。如需了解更多關于該公司的真實故事和發(fā)展歷程,建議查閱相關資料或訪問公司官網。
隨著國內市場的飽和,Carroll & Meynell Transformers Ltd公司開始將目光投向國際市場。公司積極參與國際電子行業(yè)的交流與合作,學習借鑒國際先進經驗和技術。同時,公司還加大了對海外市場的拓展力度,通過參加國際展覽、建立海外銷售網絡等方式,將產品推向全球。這一國際化戰(zhàn)略不僅為公司帶來了更廣闊的市場空間,也提升了公司的國際影響力。
近年來,網絡安全問題日益嚴重。2022年,Delta Electronics遭遇了一起勒索軟件攻擊。面對這一挑戰(zhàn),公司迅速啟動了應急響應機制,與專業(yè)的網絡安全機構合作,成功阻止了攻擊者的進一步行動。這一事件雖然給公司帶來了一定的損失,但也讓Delta更加重視網絡安全問題,加強了公司網絡安全防護體系的建設。
遇到單片機晶振不起振是常見現象,那么引起晶振不起振的原因有哪些呢? 下面我給大家簡單概括一下: (1) PCB板布線錯誤; (2) 單片機質量有問題; (3) 晶振質量有問題; (4) 負載電容或匹配電容與晶振不匹配或者電容質量有問題; (5) PCB板受 ...… 查看全部問答∨ |
CE下普通應用開發(fā)是選擇C還是高級的.NET(Java)合適? 公司有一定數量的普通應用開發(fā),涉及到Socket或其它網絡通信,而不是開發(fā)驅動程序,這種情況下的常見方案是否選擇C/C++?… 查看全部問答∨ |
舉個例子來引出我的問題 MX27 處理器以MX21 為基礎進行設計,基于ARM926EJ-S s3c2410的處理器是ARM920T 請問各位 首先,之間有什么區(qū)別,是不是:1、處理器型號?2、寄存器地址不同?等等 大家能不能幫我說個大概? 其次,編程的時候是不是每 ...… 查看全部問答∨ |
(CoreCon) Failed to connect debug message service! Please check the transport settings.(CoreCon) Transport service failed to connect(CoreCon) Error: A service has failed to connect. Make sure that all services are correctly config ...… 查看全部問答∨ |
我現在想做FPGA視頻處理方面的工作,原理一直用xilinx,現在考慮使用altera,但是不太熟悉。 哪位高手指點下,使用什么樣的芯片或開發(fā)板可以滿足高性能的視頻處理。謝謝了… 查看全部問答∨ |
|
/* ********************************************************************************************************* * & ...… 查看全部問答∨ |
在使用示波器,萬用表,等開發(fā)工具時候,你是喜歡選擇進口的外國貨還是地道的國產貨呢?? 你是否有崇洋媚外的情節(jié)呢? 來曬曬你的設備吧。 我沒有示波器,只有一臺萬用表拿來曬曬 八百左右吧。 [ 本帖最后由 gaoyang9992006 于 2013-7-24 14:5 ...… 查看全部問答∨ |