亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smc9118.c

?? U-boot源碼 ARM7啟動代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*------------------------------------------------------------------------ . smc9118.c . This is a driver for SMSC's LAN9118 single-chip Ethernet device. . . (C) Copyright 2006 ARM Ltd. <www.arm.com> . . This program is free software; you can redistribute it and/or modify . it under the terms of the GNU General Public License as published by . the Free Software Foundation; either version 2 of the License, or . (at your option) any later version. . . This program is distributed in the hope that it will be useful, . but WITHOUT ANY WARRANTY; without even the implied warranty of . MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the . GNU General Public License for more details. . . You should have received a copy of the GNU General Public License . along with this program; if not, write to the Free Software . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307	 USA . . Device information contained in this file was obtained from the LAN9118 . manual from SMC <www.smsc.com>. . . author: .	Peter Pearse				( peter.pearse@arm.com) . . Sources: .    o	  SMSC LAN9118 databook (www.smsc.com) .    o	  drivers/smc91111.c . . History: .	2006.10.24	Peter Pearse	Initial version based on drivers/smc91111.c	 .                                      - Dropped board specific code .                                      - Dropped #if 0 code,  .                                        it's in smc91111.c if you want it  .                                      - Made all but interface functions static .                                      - Add in ARM smc9118 code ----------------------------------------------------------------------------*/#include <common.h>#include <command.h>#include <config.h>#include "smc9118.h"#include <net.h>#ifdef CONFIG_DRIVER_SMC9118#define SMC9118_DEV_NAME "SMC9118"#ifndef CONFIG_SMC9118_BASE	include/configs/<board>.h must define the base address of the device registers#endif#define SMC9118_DBG 0#if SMC9118_DBG > 1static const char version[] =	"smc9118.c:v1.0 06/10/24 by Peter Pearse <peter.pearse@arm.com>\n";#endif#if (SMC9118_DBG > 2 )# define PRINTK3(args...) printf(args)#else# define PRINTK3(args...)#endif#if SMC9118_DBG > 1# define PRINTK2(args...) printf(args)#else# define PRINTK2(args...)#endif#ifdef SMC9118_DBG# define PRINTK(args...) printf(args)#else# define PRINTK(args...)#endif#if SMC9118_DBG > 0static void smsc9118_print_mac_registers(void){    unsigned int read;    int i;    i = 0;    read = 0;    for(i = 1; i <= 0xC; i++) {        smsc9118_mac_regread(i, &read);        debug("MAC Register %02d: 0x%08x\n",i,read);    }    debug("\n");    return;}static void smsc9118_print_registers(void){    volatile unsigned int *i;    for  (i = (volatile unsigned int *)CONFIG_SMC9118_BASE; (int)i < (int)SMSC9118_RESERVED3; i++){        debug("Register @%p 0x%08x\n",i, *i);    }} static void smsc9118_print_phy_registers(void){    unsigned short read;    unsigned int i;    i = 0;    read = 0;    for(i = 0; i <= 6; i++) {        smsc9118_phy_regread(i, &read);        debug("PHY Register %02d: 0x%08x\n",i,read);    }    smsc9118_phy_regread(i = 17, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    smsc9118_phy_regread(i = 18, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    smsc9118_phy_regread(i = 27, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    smsc9118_phy_regread(i = 29, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    smsc9118_phy_regread(i = 30, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    smsc9118_phy_regread(i = 31, &read);    debug("Phy Register %02d: 0x%08x\n", i, read);    debug("\n");    return;}#endif /* SMC9118_DBG > 0 *//*----------------------------------------------------------------- . .  The driver can be entered at any of the following entry points. . .------------------------------------------------------------------  */int  eth_init(bd_t *bd);void eth_halt(void);int  eth_rx(void);int  eth_send(volatile void *packet, int length);#ifdef SHARED_RESOURCES/* * Resource swapper */void swap_to(int device_id);#endif/* * ---------------------------------------------------------- * * Chip register access routines * * ---------------------------------------------------------- */static int smsc9118_mac_regread(unsigned char regoffset, unsigned int *data){    unsigned int val, maccmd;    int timedout;    int error;    ulong start;    error = 0;    val = *SMSC9118_MAC_CSR_CMD;    if(!(val & ((unsigned int)1 << 31))) {    // Make sure there's no pending operation        maccmd = 0;        maccmd |= regoffset;        maccmd |= ((unsigned int)1 << 30);     // Indicates read        maccmd |= ((unsigned int)1 << 31);     // Start bit        *SMSC9118_MAC_CSR_CMD = maccmd; // Start operation	start = get_timer (0);        do {	    timedout = get_timer(start) > MS50 ? 1 : 0;            val = *SMSC9118_BYTE_TEST;  // A no-op read.        } while(!timedout && (*SMSC9118_MAC_CSR_CMD & ((unsigned int)1 << 31)));        if(timedout) {            printf("Error: SMSC9118 MAC CSR read operation timed out.\n");            error = 1;            return error;        }        *data = *SMSC9118_MAC_CSR_DATA;    } else {        printf("Warning: SMSC9118 MAC CSR is busy. No data read.\n");        *data = 0;    }    return 0;}static int smsc9118_mac_regwrite(unsigned char regoffset, unsigned int val){    unsigned int read, maccmd;    int timedout;    int error;    ulong start;    debug("MAC[%02d] write 0x%08x \n", regoffset, val);    error = 0;    read = *SMSC9118_MAC_CSR_CMD;    if(!(read & ((unsigned int)1 << 31))) { // Make sure there's no pending operation        *SMSC9118_MAC_CSR_DATA = val;       // Load data.        maccmd = 0;        maccmd |= regoffset;        maccmd &= ~((unsigned int)1 << 30); // Clear indicates write        maccmd |= ((unsigned int)1 << 31);  // Indicate start of operation        *SMSC9118_MAC_CSR_CMD = maccmd;	start = get_timer (0);        do {	    timedout = get_timer(start) > MS50 ? 1 : 0;            read = *SMSC9118_BYTE_TEST;     // A no-op read.        } while(!timedout && (*SMSC9118_MAC_CSR_CMD & ((unsigned int)1 << 31)));        if(timedout) {            printf("Error: SMSC9118 MAC CSR write operation timed out.\n");            error = 1;            return error;        }    } else {        printf("Warning: SMSC9118 MAC CSR is busy. No data written.\n");    }    return 0;}static int smsc9118_phy_regread(unsigned char regoffset, unsigned short *data){    unsigned int val, phycmd; int error;    int timedout;    ulong start;    error = 0;    smsc9118_mac_regread(SMSC9118_MAC_MII_ACC, &val);    if(!(val & 1)) {				// Not busy        phycmd = 0;        phycmd |= (1 << 11);			// 1 to [15:11]        phycmd |= ((regoffset & 0x1F) << 6);	// Put regoffset to [10:6]        phycmd &= ~(1 << 1);			// Clear [1] indicates read.        phycmd |= (1 << 0);			// Set [0] indicates operation start        smsc9118_mac_regwrite(SMSC9118_MAC_MII_ACC, phycmd);	        val = 0;        timedout = 0;	start = get_timer (0);        do {	    timedout = get_timer(start) > MS50 ? 1 : 0;            smsc9118_mac_regread(SMSC9118_MAC_MII_ACC,&val);        } while(!timedout && (val & ((unsigned int)1 << 0)));        if(timedout) {            printf("Error: SMSC9118 MAC MII read operation timed out.\n");            error = 1;            return error;        }        smsc9118_mac_regread(SMSC9118_MAC_MII_DATA, &val);    } else {        printf("Warning: SMSC9118 MAC MII is busy. No data read.\n");        val = 0;    }    *data = (unsigned short)(val & 0xFFFF);    return 0;}static int smsc9118_phy_regwrite(unsigned char regoffset, unsigned short data){    unsigned int val, phycmd, u32data; int error;    int timedout;    ulong start;    u32data = (unsigned int)data;    debug("PHY[%02d] write 0x%08x \n", regoffset, u32data);    smsc9118_mac_regread(SMSC9118_MAC_MII_ACC, &val);    if(!(val & 1)) {    // Not busy        smsc9118_mac_regwrite(SMSC9118_MAC_MII_DATA, u32data); // Load the data        phycmd = 0;        phycmd |= (1 << 11);                    // 1 to [15:11]        phycmd |= ((regoffset & 0x1F) << 6);     // Put regoffset to [10:6]        phycmd |= (1 << 1);                     // Set [1] indicates write.        phycmd |= (1 << 0);                     // Set [0] indicates operation start        smsc9118_mac_regwrite(SMSC9118_MAC_MII_ACC, phycmd);   // Start operation        phycmd = 0;        timedout = 0;	start = get_timer (0);        do {	    timedout = get_timer(start) > MS50 ? 1 : 0;            smsc9118_mac_regread(SMSC9118_MAC_MII_ACC, &phycmd);        } while(!timedout && (phycmd & (1 << 0)));        if(timedout) {            printf("Error: SMSC9118 MAC MII write operation timed out.\n");            error = 1;            return error;        }    } else {        printf("Warning: SMSC9118 MAC MII is busy. No data written.\n");    }    return 0;}/* ------------------------------------------------------------ . . Internal routines . ------------------------------------------------------------*//* * Functions left as in/outu16, even for ARM where ARM WORD == 32 bits == (2* Other Architecture Word) * until we decide we can't use the common functions..... */#ifdef CONFIG_SMC_USE_IOFUNCS/* * input and output functions * - the access macros defined in smc9118.h may not  *   work for other boards - they have only been tested on  *   ARM RealViewEB Revision D boards  * *   This code is copied from smc91111.c (functions & types renamed), *   however 16 bit access may be different for SMC9118  *   - see the datasheet & test well before use * */# if defined(CONFIG_SMC_USE_32_BIT)	32 bit access functions not yet provided# elsestatic inline u16 SMC9118_inu16(u32 offset);static inline void SMC9118_outu16(u16 value, u32 offset);static inline u8 SMC9118_inu8(u32 offset);static inline void SMC9118_outu8(u8 value, u32 offset);static inline void SMC9118_ins16(u32 offset, volatile uchar* buf, u32 len);static inline void SMC9118_outs16(u32 offset, uchar* buf, u32 len);#define barrier() __asm__ __volatile__("": : :"memory")#define SMC9118_BASE_ADDRESS CONFIG_SMC9118_BASEstatic inline u16 SMC9118_inu16(u32 offset){	u16 v;	v = *((volatile u16*)(SMC9118_BASE_ADDRESS+offset));	barrier(); *(volatile u32*)(0xc0000000);	return v;}static inline void SMC9118_outu16(u16 value, u32 offset){	*((volatile u16*)(SMC9118_BASE_ADDRESS+offset)) = value;	barrier(); *(volatile u32*)(0xc0000000);}static inline u8 SMC9118_inu8(u32 offset){	u16  _w;	_w = SMC9118_inu16(offset & ~((u32)1));	return (offset & 1) ? (u8)(_w >> 8) : (u8)(_w);}static inline void SMC9118_outu8(u8 value, u32 offset){	u16  _w;	_w = SMC9118_inu16(offset & ~((u32)1));	if (offset & 1)			*((volatile u16*)(SMC9118_BASE_ADDRESS+(offset & ~((u32)1)))) = (value<<8) | (_w & 0x00ff);	else			*((volatile u16*)(SMC9118_BASE_ADDRESS+offset)) = value | (_w & 0xff00);}static inline void SMC9118_ins16(u32 offset, volatile uchar* buf, u32 len){	volatile u16 *p = (volatile u16 *)buf;	while (len-- > 0) {		*p++ = SMC9118_inu16(offset);		barrier();		*((volatile u32*)(0xc0000000));	}}static inline void SMC9118_outs16(u32 offset, uchar* buf, u32 len){	volatile u16 *p = (volatile u16 *)buf;	while (len-- > 0) {		SMC9118_outu16(*p++, offset);		barrier();		*(volatile u32*)(0xc0000000);	}}# endif#endif  /* CONFIG_SMC_USE_IOFUNCS */// Returns smsc9118 id.static unsigned int smsc9118_read_id(void){    return *SMSC9118_ID_REV;}static int smsc9118_check_id(void){    int error;    unsigned int id;    error = 0;    id = smsc9118_read_id();    switch(((id >> 16) & 0xFFFF)) {        case 0x118:            // If bottom and top halves of the words are the same            if(((id >> 16) & 0xFFFF) == (id & 0xFFFF)) {                printf("Error: The SMSC9118 bus is in 16-bit mode. 32-bit mode was expected.\n");                error = 1;                return error;            } else {                printf("SMSC9118 is identified successfully.\n");                break;            }        default:            printf("Error: SMSC9118 id reads: 0x%08x, either an unknown chip, or error.\n",id);            error = 1;            break;    }    if((id & 0xFFFF) == 0) {        printf("Error: This test is not intended for this chip revision.\n");        error = 1;    }    return error;}// Initiates a soft reset, returns failure or success.static __inline int smsc9118_soft_reset(void){    int timedout = 0;    ulong start;    // Soft reset    *SMSC9118_HW_CFG |= 1;    // Wait    start = get_timer(0);    while (!timedout && (*SMSC9118_HW_CFG & 1)){    	timedout = get_timer(start) < MS10 ? 0 : 1;    }    return timedout;}static __inline void smsc9118_set_txfifo(unsigned int val){    // 2kb minimum, 14kb maximum    if(val < 2 || val > 14)        return;    *SMSC9118_HW_CFG = val << 16;}static int smsc9118_wait_eeprom(void){    int timedout = 0;    // Wait    ulong start = get_timer(0);    while (!timedout && (*SMSC9118_E2P_CMD & ((unsigned int) 1 << 31))){    	timedout = get_timer(start) < MS50 ? 0 : 1;    }    return timedout;}static 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀99久久精品久久久久久软件| 青青草97国产精品免费观看| 国内一区二区视频| 99久久婷婷国产| 亚洲国产综合视频在线观看| 94色蜜桃网一区二区三区| 国产精品丝袜久久久久久app| 91亚洲资源网| 亚洲与欧洲av电影| 7777精品伊人久久久大香线蕉的 | 91麻豆国产香蕉久久精品| 亚洲啪啪综合av一区二区三区| 91视频在线看| 亚洲一区精品在线| 日韩一级黄色大片| 韩国理伦片一区二区三区在线播放| 精品三级在线看| 99久久99精品久久久久久| 亚洲另类在线制服丝袜| 在线观看日韩电影| 久久精品99国产精品| 久久精品这里都是精品| 成人av电影在线观看| 亚洲国产成人av| 久久久激情视频| 91婷婷韩国欧美一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久综合狠狠综合久久综合88| 国产成人精品亚洲日本在线桃色| 亚洲一区中文日韩| 日韩欧美亚洲另类制服综合在线| 九色综合狠狠综合久久| 久久久国产精品午夜一区ai换脸| 成人av资源下载| 亚洲午夜久久久| 精品久久国产老人久久综合| 色婷婷综合久久久久中文一区二区 | 亚洲日本在线天堂| 欧美在线观看禁18| 国产一区二区电影| 亚洲永久精品国产| 久久久蜜桃精品| 欧美精品精品一区| a亚洲天堂av| 日本亚洲视频在线| 亚洲乱码日产精品bd| 欧美草草影院在线视频| a4yy欧美一区二区三区| 国产制服丝袜一区| 午夜精品久久久久久久| 久久久久97国产精华液好用吗| 337p亚洲精品色噜噜| 成人精品免费网站| 麻豆精品新av中文字幕| 亚洲一区二区三区四区五区中文| 精品盗摄一区二区三区| 欧美丝袜自拍制服另类| 91视频精品在这里| 国产一区二区三区高清播放| 亚洲二区在线观看| 精品国产一区二区亚洲人成毛片 | 另类小说欧美激情| 一区二区三区小说| 亚洲日本免费电影| 亚洲国产精品v| 欧美一级淫片007| 欧美午夜在线观看| 99久久99久久综合| 成人网在线免费视频| 国产精品一区二区久激情瑜伽| 日韩精品欧美精品| 亚洲国产视频一区| 亚洲18色成人| 亚洲乱码国产乱码精品精98午夜| 欧美激情一区三区| 国产精品欧美一级免费| 亚洲精品在线免费观看视频| 91麻豆精品国产91久久久久久 | 中文字幕精品综合| 精品成人a区在线观看| 欧美一区二区三区不卡| 极品少妇xxxx偷拍精品少妇| 久久精品国产澳门| 免费观看在线综合| 亚洲综合在线免费观看| 一级女性全黄久久生活片免费| 日韩码欧中文字| 国产亚洲成年网址在线观看| 国产亚洲精品久| 久久久噜噜噜久久中文字幕色伊伊 | 国产目拍亚洲精品99久久精品| 在线观看av一区二区| 欧美体内she精高潮| 欧美色区777第一页| 欧洲国内综合视频| 91精品国产品国语在线不卡| 91精品国产综合久久久蜜臀粉嫩 | 欧美一区二区三区婷婷月色| 欧美久久久久久久久| 欧美日韩在线三级| 精品裸体舞一区二区三区| 精品国产a毛片| 国产亚洲欧美一区在线观看| 国产人伦精品一区二区| 国产精品国产三级国产aⅴ中文| 国产精品乱码一区二区三区软件 | 欧美国产禁国产网站cc| 欧美激情一区三区| 亚洲激情第一区| 乱一区二区av| 国产成人aaa| 91色九色蝌蚪| 日韩亚洲欧美在线| 久久色视频免费观看| 中文字幕 久热精品 视频在线| 一区二区三区不卡在线观看| 日韩电影一区二区三区四区| 国产一区二区福利视频| 欧美网站一区二区| 日韩精品专区在线影院观看| 久久久久久久电影| 亚洲国产精品久久久久秋霞影院| 美腿丝袜在线亚洲一区| 国产精品一区二区久久精品爱涩| 在线观看一区二区精品视频| 91精品国产高清一区二区三区蜜臀| 欧美精品一区二区三区在线 | 亚洲r级在线视频| 九一九一国产精品| 91看片淫黄大片一级| 26uuu国产电影一区二区| 精品粉嫩aⅴ一区二区三区四区| 国产午夜精品在线观看| 中文字幕一区二区三区在线观看| 蜜臀av国产精品久久久久| 成人午夜私人影院| 欧洲另类一二三四区| 国产精品妹子av| 免费av成人在线| 粉嫩蜜臀av国产精品网站| 欧美高清激情brazzers| 国产精品美女久久久久久久久| 一区二区三区91| 国产福利91精品一区| 欧美精品久久一区| 日韩天堂在线观看| 午夜伊人狠狠久久| 成人av免费在线| 国产日产欧美一区二区三区| 奇米综合一区二区三区精品视频| av激情成人网| 中文字幕欧美三区| 激情文学综合网| 欧美在线免费视屏| 中文字幕一区日韩精品欧美| 国产一区二区三区| 日韩视频一区二区| 一级做a爱片久久| 91小视频在线| 中文文精品字幕一区二区| 裸体健美xxxx欧美裸体表演| 波多野结衣91| 91精品国产综合久久婷婷香蕉| 亚洲成人av电影在线| 91九色02白丝porn| 亚洲天堂免费在线观看视频| 成人午夜激情在线| 久久久久久久电影| 国产精品自在在线| 久久久久久久久久久电影| 久99久精品视频免费观看| 久久综合色综合88| 国产中文一区二区三区| 欧美大片日本大片免费观看| 男女性色大片免费观看一区二区 | 91精品国产综合久久精品| 亚洲欧美国产77777| 北条麻妃国产九九精品视频| 亚洲色欲色欲www| 91麻豆精品一区二区三区| 亚洲女同一区二区| 欧美色大人视频| 麻豆国产精品一区二区三区| 26uuu色噜噜精品一区二区| 成人av手机在线观看| 一区2区3区在线看| 日韩欧美在线影院| 国产电影一区二区三区| 综合分类小说区另类春色亚洲小说欧美 | 午夜精品久久久久久久 | 欧美一三区三区四区免费在线看| 五月天久久比比资源色| 精品国产91久久久久久久妲己 | 99视频精品全部免费在线| 一区二区三区日本| 欧美mv日韩mv国产网站| av一二三不卡影片| 日日夜夜精品视频免费| 国产清纯在线一区二区www| 在线日韩av片|