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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pci設(shè)備(網(wǎng)卡)初始化代碼分析.txt

?? 以PowerPC上的PCI設(shè)備為例,介紹PCI設(shè)備初始化編程的過(guò)程,其他CPU的PCI基本框架是類似的.
?? TXT
字號(hào):
>>Drew的主頁(yè)---->程序示例---->PCI

主頁(yè)
 VxWorks
 ARM
 PowerPC
 硬件驅(qū)動(dòng)
 網(wǎng)絡(luò)協(xié)議
 程序示例
 技術(shù)論壇 下載
 個(gè)人興趣 

 

PCI設(shè)備(網(wǎng)卡)初始化代碼分析

 

  這里以PowerPC上的PCI設(shè)備為例,介紹PCI設(shè)備初始化編程的過(guò)程,其他CPU的PCI基本框架是類似的.

  PowerPC的PCI控制器符合PCI2.2標(biāo)準(zhǔn),以下使我解讀的VxWorks系統(tǒng)PCI設(shè)備程序代碼分析

主要執(zhí)行過(guò)程

1.初始化PCI設(shè)備

文件romInit.s中romInit()=======>文件bootInit.c中romStart()========>文件usrConfig.c中的usrInit()======>文件syslib.c中的sysHwInit()

syslib.c 

void sysHwInit (void){                     //用于初始化系統(tǒng)硬件

......................

//和網(wǎng)絡(luò),PCI有關(guān)的函數(shù)

#ifdef INCLUDE_EMAC_NETWORK


//初始化媒介訪問層MAL(控制EMAC和Buffer Descriptor BD間的數(shù)據(jù)傳輸)

malReset();                     

#endif

#ifdef INCLUDE_PCI        
pciInit();                     //初始化PCI
#endif

#ifdef INCLUDE_NETWORK
sysNetHwInit();                 //初始化網(wǎng)絡(luò)接口
#endif

}

 

//該函數(shù)初始化PCI

PCI的地址轉(zhuǎn)換形式: 

CPU->PCI (master/initiator) 地址轉(zhuǎn)換
PCI->CPU (slave/target) 地址轉(zhuǎn)換

void pciInit()        
{

unsigned short temp_short;

/*
* 初始化并 disable 所有的 PCI Master regions(三個(gè)), 
   little endian,直接對(duì)寄存器R操作     */

sysPciOutLong(PMM0MA, PMM_UNUSED);
sysPciOutLong(PMM1MA, PMM_UNUSED);
sysPciOutLong(PMM2MA, PMM_UNUSED);

/*

解釋:

PMM0MA:地址 0xEE400004, 控制PLB上的映射到PCI存儲(chǔ)空間的range0大小和屬性. 

在PLB上共有三個(gè)ranges, PMM1MA代表區(qū)域rang1, PMM2MA代表區(qū)域range2.

PMM_UNUSED: 0x00000000    

range的定義

range: map  PLB======>PCI  64-bit

PPBridge(PLB和PCI設(shè)備間的接口)responds as a target on the PLB bus in servral address ranges.

These ranges allow a PLB Master to configure the PPBridge and to cause PPBridge to generate Mem I/O,interrupt acknowledge and special cycles to PCI bus.

*/


/*
* Initially disable PCI Target region 2 to start. Region 1 is hardwired
* to always be active.
*/

//PTM2MS:地址 0xEF400038,定義PCI存儲(chǔ)空間的大小.這里清零

sysPciOutLong(PTM2MS, PTM_UNUSED);

/*
* Drive PCI 重新置位. 用于熱啟動(dòng),置位必須保持1ms
*/


//解釋: 從PCI寄存器PCI_CFG_BRIDGE_OPT2中讀出數(shù)值

        其中 PPC405GP_PCI_BUSDEVFUNC = 0x00000000;

            PCI_CFG_BRIDGE_OPT2 = 0x60

temp_short = pciConfigIn(PPC405GP_PCI_BUSDEVFUNC, PCI_CFG_BRIDGE_OPT2, 2);

//把讀出的值放回寄存器PCI_CFG_BRIDGE_OPT2中

pciConfigOut(PPC405GP_PCI_BUSDEVFUNC, PCI_CFG_BRIDGE_OPT2,
temp_short | 0x1000, 2);

sysLocalDelay(1); /* 延時(shí)1ms kernel may not be up yet!! */

//再放一次

pciConfigOut(PPC405GP_PCI_BUSDEVFUNC, PCI_CFG_BRIDGE_OPT2, temp_short, 2);


/*
* 設(shè)置PCI Master(PMM),這是從本地存儲(chǔ)地址Local memory address到PCI空間的映射   * CPU->PCI,參見文件 See config.h中的定義,參考 BSP配置文件
*/


//說(shuō)明sysPciOutLong(A,B);放B到A

//PMM region 0 

//PMM0LA 0xEF400000, PMM0_LOCAL_ADRS 0x80000000

sysPciOutLong(PMM0LA, PMM0_LOCAL_ADRS);

//PMM0PCILA 0xEF400008, PMM0_PCI_LOW_ADRS 0x80000000

sysPciOutLong(PMM0PCILA, PMM0_PCI_LOW_ADRS);

//PMM0PCIHA 0xEF40000C, PMM0_PCI_HIGH_ADRS 0x00000000

sysPciOutLong(PMM0PCIHA, PMM0_PCI_HIGH_ADRS);

//PMM0MA 0xEF400004, 

//PMM0_PCI_MASK_ATTRIB PMM_MASK_512MB|PMM_ENABLE

sysPciOutLong(PMM0MA, PMM0_PCI_MASK_ATTRIB);


sysPciOutLong(PMM1LA, PMM1_LOCAL_ADRS); /* PMM region 1 */
sysPciOutLong(PMM1PCILA, PMM1_PCI_LOW_ADRS);
sysPciOutLong(PMM1PCIHA, PMM1_PCI_HIGH_ADRS);
sysPciOutLong(PMM1MA, PMM1_PCI_MASK_ATTRIB);

sysPciOutLong(PMM2LA, PMM2_LOCAL_ADRS); /* PMM region 2 */
sysPciOutLong(PMM2PCILA, PMM2_PCI_LOW_ADRS);
sysPciOutLong(PMM2PCIHA, PMM2_PCI_HIGH_ADRS);
sysPciOutLong(PMM2MA, PMM2_PCI_MASK_ATTRIB);



/*
* 設(shè)置 PCI Target (PTM). 這是從PCI的地址到本地地址的映射
* 參見文件 config.h中的定義
* 如果不是用 region 2, 必須保證它的使能位關(guān)閉,region 1硬件連接使能.
*/


//PTM1LA 0xEF400034,  PTM1_LOCAL_ADRS 0x00000000

sysPciOutLong(PTM1LA, PTM1_LOCAL_ADRS);

//PTM1MS 0xEF400030, 

sysPciOutLong(PTM1MS, PTM1_SIZE_ATTRIB);

...................

/*
* 寫 405GP PCI 設(shè)置寄存器.
* 使能 405GP,使其成為PCI總線的一個(gè)master (PMM).
* 使能 405GP 作為一個(gè)PCI memory target (PTM).
*/

temp_short = pciConfigIn(PPC405GP_PCI_BUSDEVFUNC, PCI_CFG_COMMAND, 2);
temp_short = temp_short | PCI_CMD_MASTER_ENABLE | PCI_CMD_MEM_ENABLE;
pciConfigOut(PPC405GP_PCI_BUSDEVFUNC, PCI_CFG_COMMAND, temp_short, 2);

..........................


/*
* 作為PCI的主機(jī)host掃描PCI總線,查找PCI設(shè)備. 并為每個(gè)設(shè)備分配唯一的PCI或I/O地址* 空間
*/

pciScan(0);
return;
}

 

//pciScan() - 掃描PCI總線,根據(jù)PCI ID和 vender ID查找設(shè)置現(xiàn)有的PCI設(shè)備

void pciScan
(
int busNum        
)
{
int Device;
int BusDevFunc;



/*
* 從device 1開始,查找每個(gè)Slot,如有PCI設(shè)備,分配內(nèi)存和I/O, 405GP是 device 0.
*/


for (Device = 1; Device <= WALNUT_NUM_PCI_SLOTS; Device++)
{
BusDevFunc = (busNum << 16) | (Device << 11);

//如果Device存在
if (pciConfigIn(BusDevFunc, PCI_CFG_VENDOR_ID,2) != 0xFFFF) 
{
#ifdef PCIDEBUG
printf("* * * * * * * * * * * * * * * * *\n");
printf("Device %d is present\n",Device);
#endif
switch( pciConfigIn(BusDevFunc, PCI_CFG_SUBCLASS, 2) )
{

case 0x0604:          /* PCI-PCI Bridge */
break;

default:
pciDumpDevice(BusDevFunc);           //打印 Vendor ID, Device ID

//調(diào)用pciConfigDevice(BusDevFunc, 6)對(duì)PCI設(shè)備進(jìn)行設(shè)置


pciConfigDevice(BusDevFunc, 6);
}
}
else
{
#ifdef PCIDEBUG
printf("Device %d not present\n",Device);
#endif
}
}
}

//pciConfigDevice - 為PCI設(shè)備配置內(nèi)存和I/O方式

void pciConfigDevice(int BusDevFunc,int NumBaseAddr)
{
int AddrSlot;
int i;
unsigned long AddrDesc;
unsigned long AddrProg;
unsigned long Min_Gnt_Val;


// NumBaseAddr = 6
for (AddrSlot = 0; AddrSlot < NumBaseAddr; AddrSlot++)
{

// PCI_CFG_BASE_ADDRESS_0 = 0x10 將0xFFFFFFFF寫入   PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot)
pciConfigOut(BusDevFunc, PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot),
0xFFFFFFFF, 4);

// 從PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot)讀出數(shù)據(jù)
AddrDesc = pciConfigIn(BusDevFunc,
PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot),
4);


// 如果數(shù)據(jù)是0,沒有PCI設(shè)備,繼續(xù)循環(huán)搜索
if (AddrDesc == 0) /* unimplemented, stop looking */
continue;

#ifdef PCIDEBUG
printf("Read Base Addr Reg %d = 0x%08x\n",AddrSlot,AddrDesc);
#endif
/* 如果AddrDesc的位0是0,表示是Mem方式 */
if ((AddrDesc & 1) == 0) 
{
AddrDesc &= 0xFFFFFFF0;

for (i = 0; (AddrDesc & 1) != 1; i++)    //查詢Mem的大小
AddrDesc = AddrDesc >> 1;

AddrDesc = 1 << i;

if ((unsigned long)AddrDesc < 4096)
AddrDesc = 4096;
#ifdef PCIDEBUG
printf(" PCI Memory space = 0x%x bytes \n",AddrDesc);
#endif
for (AddrProg = PCI_MEMORY_START;
AddrProg < LowestMemAddr;
AddrProg += AddrDesc);

pciConfigOut(BusDevFunc, PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot),
AddrProg, 4);
LowestMemAddr = AddrProg + AddrDesc;
}
else             /* I/O 方式*/
{
AddrDesc &= 0xFFFFFFFC;

for (i = 0; (AddrDesc & 1) != 1; i++)     //查詢I/O空間的大小
AddrDesc = AddrDesc >> 1;

AddrDesc = 1 << i;
#ifdef PCIDEBUG
printf(" PCI I/O space = 0x%x bytes \n",AddrDesc);
#endif
for (AddrProg = PCI_IO_REGION_1_START;
AddrProg < LowestIOAddr;
AddrProg += AddrDesc);

pciConfigOut(BusDevFunc, PCI_CFG_BASE_ADDRESS_0 + (4*AddrSlot),
AddrProg, 4);
LowestIOAddr = AddrProg + AddrDesc;
}

}


/*
* Read Min_Gnt(0x3eh) register value and write it to
* the Latency Timer(0xdh) register
*/
Min_Gnt_Val = 0x80;
pciConfigOut(BusDevFunc, PCI_CFG_LATENCY_TIMER, Min_Gnt_Val, 1);

}

2.PCI網(wǎng)卡驅(qū)動(dòng)調(diào)用過(guò)程

sysNet.c用于初始化系統(tǒng)的網(wǎng)絡(luò)

文件sysNet.c中void sysNetHwInit(void)定義了,這里以AMD PCI網(wǎng)卡97x為例:

#ifdef INCLUDE_PCI_NETWORK
    unsigned char sysEnetAddr [6]; /* 網(wǎng)卡的 MAC 地址 */
    char sys97xLoadString[100];    /* 需要為初始化加載的字符串 */
#endif

#ifdef INCLUDE_PCI_NETWORK
     STATUS sysIn97xEndBldLoadStr()    // 生成網(wǎng)絡(luò)初始化的字符串


函數(shù)sysIn97xEndBldLoadStr()調(diào)用pciFindDevice()

STATUS pciFindDevice  //用Vendor ID和Device ID查找PCI網(wǎng)卡
(
int VendorID,
int DeviceID,
int index,
int *busDevFunc
)
{
int Device;
int tmpBusDevFunc;
int tmpIndex;
int busNum;

tmpIndex = 0;
for (busNum = MaxBusNum; busNum >= 0; busNum--)    //查訊Slot
{
for (Device = 0; Device <= WALNUT_NUM_PCI_SLOTS; Device++)
{
tmpBusDevFunc = (busNum << 16) | (Device << 11);

// 如果指定寄存器中Vendor ID和Device ID正確,賦值給*busDevFunc,返回

if (pciConfigIn(tmpBusDevFunc, PCI_CFG_VENDOR_ID, 2) == VendorID
&& pciConfigIn(tmpBusDevFunc, PCI_CFG_DEVICE_ID, 2) == DeviceID)
{
if (tmpIndex == index)
{
*busDevFunc = tmpBusDevFunc;
return (OK);
}
else /* have a match, but not correct index */
{
tmpIndex++;
}
} } }
return (ERROR); }


   sysln97xEndBldLoadStr(..)查找PCI以太網(wǎng)卡,得到PCI網(wǎng)卡的基地址,根據(jù)PCI插槽Slot選擇正確的中斷向量,讀網(wǎng)卡的MAC地址,然后調(diào)用ln97xEndLoad

STATUS sysln97xEndBldLoadStr ( void )
{
int i;
int intvec;
int intlvl;
ULONG pciMemAddr;
unsigned int busDevFunc;


/*
* 在PCI總線上查找設(shè)置第一個(gè)AMD設(shè)備.
* 如果發(fā)現(xiàn)存在,函數(shù)pciFindDevice 為busDevFunc賦值
*/

if (pciFindDevice(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_79C97X, 0, &busDevFunc))
return(ERROR);

/*
* 97x的基地址 1 包含PCI存儲(chǔ)空間的基地址.
*/
pciMemAddr = pciConfigIn(busDevFunc, PCI_CFG_BASE_ADDRESS_1, 4);
pciMemAddr &= 0xFFFFFFF0;

/*
* 設(shè)置PCI定時(shí)器反應(yīng)時(shí)間為50 Set latency timer to 50.
*/
pciConfigOut(busDevFunc, PCI_LATENCY_TIMER, 50, 1);

/*
* 每個(gè)PCI插槽連接到中斷控制器的管腳不一樣,中斷取決于網(wǎng)卡插在哪一個(gè)PCI插槽上.
*/
switch ((busDevFunc & 0x0000F800) >> 11) /* Strip off just the device */
{
case 1 : intvec = INT_VEC_PCI_SLOT3; /* 插槽 3 */
intlvl = INT_LVL_PCI_SLOT3;
break;
case 2 : intvec = INT_VEC_PCI_SLOT2; /* 插槽 2 */
intlvl = INT_LVL_PCI_SLOT2;
break;
case 3 : intvec = INT_VEC_PCI_SLOT1; /* 插槽 1 */
intlvl = INT_LVL_PCI_SLOT1;
break;
case 4 : intvec = INT_VEC_PCI_SLOT0; /* 插槽 0 */
intlvl = INT_LVL_PCI_SLOT0;
break;
default : return(ERROR); /* Not possible, error */

}

/*
* 使能PCI Mem cycles 和 總線 Master 操作
*/
pciConfigOut(busDevFunc, PCI_CFG_COMMAND,
PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE, 2);

/*
* 得到網(wǎng)卡的MAC地址
*/
for (i=0; i<6; i++)
sysEnetAddr[i] = sysInByte(pciMemAddr+APROM01+i);

/*
* 生成初始化字符串,如一下形式:
*
* <devMemAddr>:<devIoAddr>:<pciMemBase>:<vecNum>:<intLvl>:<memAdrs>:
* <memSize>:<memWidth>:<csr3b>:<offset>:<flags>
*
* 這個(gè)字符串將在函數(shù)muxEndLoad()中加載
*/

sprintf(sys97xLoadString, "0x%x:0x%x:0:%d:%d:0x%x:0:0x%x:0:0:0",
(unsigned int)pciMemAddr, NONE, intvec, intlvl,
NONE,NONE);

return(OK);

}


 

 

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产婷婷精品av在线| 亚洲人成精品久久久久久| 国产乱妇无码大片在线观看| 国产精品福利一区| 欧美一区二区三区四区五区 | 国产suv精品一区二区6| 亚洲精品成人在线| 久久久久久亚洲综合影院红桃 | 首页国产丝袜综合| 亚洲欧洲精品一区二区三区不卡| 在线成人午夜影院| bt欧美亚洲午夜电影天堂| 奇米精品一区二区三区四区| 亚洲精品国产无天堂网2021| 中文乱码免费一区二区| 精品国产成人系列| 欧美日韩精品欧美日韩精品| 91碰在线视频| 成人一区二区视频| 国内精品不卡在线| 久久国产免费看| 日韩av电影免费观看高清完整版 | 欧美日韩一区不卡| 成人av电影在线观看| 韩国成人精品a∨在线观看| 亚洲一卡二卡三卡四卡无卡久久 | 一本色道亚洲精品aⅴ| 国产高清久久久| 激情小说亚洲一区| 蜜桃精品在线观看| 奇米影视7777精品一区二区| 午夜欧美视频在线观看| 一区二区三区国产精品| 中文字幕在线一区二区三区| 国产精品少妇自拍| 中国色在线观看另类| 亚洲国产精品高清| 欧美激情一区在线观看| 久久久影视传媒| 国产视频一区不卡| 国产日韩精品久久久| 国产亚洲美州欧州综合国| 久久综合色鬼综合色| 精品久久久久一区| 精品国产第一区二区三区观看体验 | 久久精品国产**网站演员| 秋霞午夜av一区二区三区| 久久久精品中文字幕麻豆发布| 国产亚洲一区二区三区在线观看 | 99久久精品国产一区| 99久久久久久| 欧美在线一二三四区| 欧美伊人精品成人久久综合97| 91精彩视频在线观看| 欧美亚洲一区二区在线| 欧美人体做爰大胆视频| 欧美成人艳星乳罩| 国产亚洲美州欧州综合国| 国产精品对白交换视频| 亚洲制服丝袜在线| 婷婷开心激情综合| 激情成人综合网| 成人av资源下载| 91久久精品一区二区| 欧美一卡二卡在线观看| 久久久久久久久久久黄色| 国产精品美日韩| 亚洲伊人伊色伊影伊综合网| 六月丁香婷婷久久| 丰满放荡岳乱妇91ww| 91亚洲精品久久久蜜桃网站| 欧美日韩高清一区| 久久婷婷一区二区三区| 亚洲天堂免费看| 亚洲国产色一区| 国产一区二区免费看| 91麻豆精品视频| 欧美一区二区久久久| 国产精品免费丝袜| 亚洲成av人片一区二区梦乃 | 欧美性xxxxxx少妇| 欧美tickle裸体挠脚心vk| 中文字幕五月欧美| 日韩综合一区二区| 成人激情动漫在线观看| 在线观看91精品国产麻豆| 国产女主播视频一区二区| 亚洲国产精品久久艾草纯爱| 国产精品夜夜嗨| 欧美三级资源在线| 欧美经典一区二区三区| 亚洲一区二区四区蜜桃| 国产成人精品免费| 欧美酷刑日本凌虐凌虐| 国产精品久久久久久亚洲伦 | 色哟哟欧美精品| 26uuu国产电影一区二区| 亚洲精品国久久99热| 国产高清久久久| 91精品国产免费| 一区二区三区加勒比av| 风流少妇一区二区| 3d动漫精品啪啪1区2区免费| 亚洲日本欧美天堂| 国产乱码字幕精品高清av| 欧美日韩国产另类一区| 亚洲图片你懂的| 国产高清精品在线| 精品久久久影院| 视频一区视频二区在线观看| 色婷婷精品大视频在线蜜桃视频| 久久婷婷国产综合国色天香| 亚洲成av人片| 91年精品国产| 中文子幕无线码一区tr| 国产原创一区二区三区| 欧美一区二区三区四区久久| 亚洲国产色一区| 在线区一区二视频| 中文字幕一区在线| 国产不卡高清在线观看视频| 日韩欧美亚洲国产另类| 亚洲成人自拍一区| 91福利在线看| 中文字幕一区二区三区蜜月| 日韩亚洲欧美在线| 综合久久久久久| 成人美女在线视频| 国产情人综合久久777777| 国产一区二区视频在线播放| 日韩欧美在线不卡| 色偷偷成人一区二区三区91 | 国产麻豆精品在线| 欧美va天堂va视频va在线| 日本不卡视频在线观看| 欧美高清hd18日本| 日韩av一区二区在线影视| 欧美午夜寂寞影院| 亚洲国产欧美一区二区三区丁香婷| 91蝌蚪porny成人天涯| 亚洲欧洲三级电影| 色偷偷一区二区三区| 亚洲综合色视频| 在线播放亚洲一区| 麻豆一区二区在线| 久久综合久久久久88| 国产精品66部| 中文字幕一区av| 欧洲人成人精品| 视频一区视频二区在线观看| 欧美一级电影网站| 国产美女视频91| 欧美激情中文字幕一区二区| 成人av网址在线| 一区二区三区**美女毛片| 欧美伦理影视网| 久久精品99国产精品| 久久品道一品道久久精品| 成人免费高清视频| 一区二区三区自拍| 91精品国产免费| 成人爽a毛片一区二区免费| 国产精品国产三级国产有无不卡 | 亚洲另类一区二区| 欧美日韩国产另类一区| 精品一区二区三区在线观看国产| 久久综合成人精品亚洲另类欧美| 成人黄色综合网站| 亚洲高清免费观看高清完整版在线观看| 欧美一区二区三区在线看| 国产精品综合二区| 一级日本不卡的影视| 欧美一级黄色片| 成人h动漫精品一区二区 | 国产一区二区日韩精品| ●精品国产综合乱码久久久久| 欧美剧情片在线观看| 国产黄色精品视频| 亚洲成a人在线观看| 国产日产精品一区| 欧洲日韩一区二区三区| 国产一区二区电影| 一级日本不卡的影视| 久久欧美中文字幕| 欧美色老头old∨ideo| 国产成人在线网站| 亚洲成人av一区| 国产精品欧美极品| 欧美一级高清片| 色狠狠桃花综合| 国产很黄免费观看久久| 午夜精品国产更新| 中文字幕乱码日本亚洲一区二区| 欧洲国内综合视频| 成人丝袜高跟foot| 久久精品国产免费看久久精品| 亚洲欧美日韩一区二区三区在线观看 | 性感美女久久精品| 国产精品毛片久久久久久| 日韩三级.com|