?? cpb40drvapi.c
字號:
/*=============================================================
* Copyright (c) 2008~2010, CPIT. All Rights Reserved.
*
* MODULE: i2c 驅動
*
* FILENAME: i2cDrv8548.c
*
* DESCRIPTION:i2c 驅動程序代碼
*
*
* HISTORY:
*
* Date CR No Person Description
* ---------- ------------ ------ -------------
* 2008-11-27 litao created.
*
=============================================================*/
#include "vxWorks.h"
#include "sysLib.h"
#include "stdio.h"
#include "semLib.h"
#include "taskLib.h"
#include "../../comm_drv/nbDrvDef.h"
#include"../../comm_drv/nbdrvcommintf.h"
#include "../../Driver/I2C8548/8548_I2C/inc/i2cDrv8548.h"
#include "../inc/cpb40DrvApi.h"
#include "../inc/cpb8548Drv.h"
UINT8 gDdConfigWords[] =
{
0xAA,0x55,0xAA,
0xFF,0xFF,0xFF,0x00,0x2F,0x0C,0x00,
0xFF,0xFF,0xFF,0x44,0xEC,0x00,0x18,
0x01,
0x00,0x2F,0x0C,0x00,0x04,0xEC,0x00,0x28,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
STATUS cpb_reset_8144(void)
{
*(UINT8 *)CPB_CPLD_RESET_8144_REG=0x05;
taskDelay(sysClkRateGet());
return OK;
}
SYS_STATUS cpb_cfg_8144()
{
UINT32 cfg_len = 0;
UINT32 cfg_addr = 0x0;
/*write 8144 config*/
/*8144 reset status*/
cpb_reset_8144();
cfg_len = sizeof(gDdConfigWords);
if(NB_DRV_OK != mpc8548_i2c_write(1,0x50,0x00,cfg_len,(UINT8 *)&gDdConfigWords[0]))
{
printf("\r\n8144 config failed.");
return ERROR;
}
/*8144 reset status cleared*/
cpb_reset_8144();
return NB_DRV_OK;
}
/*------------------------------------------------------------------------------
*
* Function Name: fpga_download
*
* Input(s):
* UINT8* pdata:加載數據
* UINT32 len:加載數據長度
*
* Output(s):
* <none>
*
* Returns:
* DRV_OK: 成功
* DRV_ERR:失敗
* DRV_API_ERR_INPUT_PARA:輸入參數錯誤
*
* Description:
*GPIO 的管腳定義:
*GPOUT12 FPGA異步全片復位PROGRAM_B
*GPOUT13 FPGA配置時鐘CCLK0
*GPOUT14 FPGA配置讀寫信號RDWR_B
*GPIN9 FPGA配置完成標志DONE
*GPIN10 FPGA配置校驗標志INIT_B
*GPIN11 FPGA配置忙標志BUSY
*GPOUT0 FPGA配置數據D7
*GPOUT1 FPGA配置數據D6
*GPOUT2 FPGA配置數據D5
*GPOUT3 FPGA配置數據D4
*GPOUT4 FPGA配置數據D3
*GPOUT5 FPGA配置數據D2
*GPOUT6 FPGA配置數據D1
*GPOUT7 FPGA配置數據D0
*
------------------------------------------------------------------------------*/
SYS_STATUS cpb_fpga_download (UINT8 fpga_id, UINT8* str_ptr, UINT32 str_len)
{
UINT32 i;
UINT32 code = 0;
UINT8 *file_ptr = NULL;
UINT8 val;
UINT8 orderval;
UINT8 tempnum;
UINT32 tempval = 0;
UINT32 immr_val = /*(vxImmrGet() && 0xff000000)*/0x80000000;
if ((NULL == str_ptr ) || (0 == str_len) || (fpga_id>1))
{
return CPB_PARA_ERROR;
}
file_ptr = str_ptr;
*M85XX_GPIOCR(immr_val) |= (TX2OUT | RX2IN | PCIOUT |PCIIN|GPOUT);
*M85XX_DEVDISR(immr_val) |= ETSEC2_DISABLE;
*M85XX_DEVDISR(immr_val) |= (PCI2_DISABLE|PCI1_DISABLE);
if(0 == fpga_id)
{
/*prepare download, pulse PROGRAM pin down.*/
*M85XX_GPOUTDR(immr_val) &= (~FPGA1_PROG);
/*INIT_B*/
/* *M85XX_GPINDR(immr_val) &= (~FPGA1_INIT);*/
while(((*M85XX_GPINDR(immr_val) ) & (FPGA1_INIT)));
taskDelay(3) ;
*M85XX_GPOUTDR(immr_val) |= FPGA1_PROG;/* release */
/*taskDelay(3) ;*/
/* *M85XX_GPINDR(immr_val) |= FPGA1_INIT;*//* release */
while(!((*M85XX_GPINDR(immr_val) ) & (FPGA1_INIT)));
/*set CS*/
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) &=(~FPGA1_CS);
/**M85XX_GPOUTDR(immr_val) &=(~FPGA1_RDWR);*//*write fpga input*/
taskDelay(50) ; /* wait until FPGA finished internal memory clear */
/*check done pin, must be low*/
#if 0
if ((*M85XX_GPINDR(immr_val) & FPGA_DONE ))
{
printf("\r\nfpga_download:fpga busy.....");
return DRV_API_ERR_FPGA_BUSY ;
}
#endif
/*put data onto the FPGA*/
while ( code < str_len )
{
val = file_ptr[code++];
orderval = 0;
for(i = 0; i < 4; i++)
{
tempnum = (val>>(7 - i*2)) &((UINT8)0x80 >>(7 - i));
orderval |= tempnum;
tempnum = (val<<(7 - i*2)) &((UINT8)0x01 <<(7 - i));
orderval |= tempnum;
}
*M85XX_GPOUTDR(immr_val) &= (~FPGA1_CCLK); /* set CCLK lo */
tempval = *M85XX_GPOUTDR(immr_val);
*M85XX_GPOUTDR(immr_val) = (orderval |(tempval & (~FPGA_DATA_MASK)));/* put byte onto FPGA */
*M85XX_GPOUTDR(immr_val) |= FPGA1_CCLK; /* set CCLK hi */
}
/* send the bits of the last double word */
for (i = 0; i < 120; i++)
{
*M85XX_GPOUTDR(immr_val) &= (~FPGA1_CCLK); /* set CCLK lo */
*M85XX_GPOUTDR(immr_val) |= FPGA1_CCLK; /* set CCLK hi */
}
taskDelay(10);
if (!(*M85XX_GPINDR(immr_val) & FPGA1_DONE ))
{
printf("\r\nfpga_download:fpga is not done.....");
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
return ERROR ;
}
/*set CS*/
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
/*reset_fpga1*/
}
else
{
/*prepare download, pulse PROGRAM pin down.*/
*M85XX_GPOUTDR(immr_val) &= (~FPGA2_PROG);
/*INIT_B*/
*M85XX_GPINDR(immr_val) &= (~FPGA2_INIT);
taskDelay(3) ;
*M85XX_GPOUTDR(immr_val) |= FPGA2_PROG;/* release */
taskDelay(3) ;
*M85XX_GPINDR(immr_val) |= FPGA2_INIT;/* release */
/*set CS*/
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
*M85XX_GPOUTDR(immr_val) &=(~FPGA2_CS);
/**M85XX_GPOUTDR(immr_val) &=(~FPGA1_RDWR);*//*write fpga input*/
taskDelay(50) ; /* wait until FPGA finished internal memory clear */
/*check done pin, must be low*/
#if 0
if ((*M85XX_GPINDR(immr_val) & FPGA_DONE ))
{
printf("\r\nfpga_download:fpga busy.....");
return DRV_API_ERR_FPGA_BUSY ;
}
#endif
/*put data onto the FPGA*/
while ( code < str_len )
{
val = file_ptr[code++];
orderval = 0;
#if 1
for(i = 0; i < 4; i++)
{
tempnum = (val>>(7 - i*2)) &((UINT8)0x80 >>(7 - i));
orderval |= tempnum;
tempnum = (val<<(7 - i*2)) &((UINT8)0x01 <<(7 - i));
orderval |= tempnum;
}
#endif
/*orderval = val;*/
*M85XX_GPOUTDR(immr_val) &= (~FPGA2_CCLK); /* set CCLK lo */
tempval = *M85XX_GPOUTDR(immr_val);
/* *M85XX_GPOUTDR(immr_val) = ((orderval << 24) |(tempval & (~FPGA_DATA_MASK)));*//* put byte onto FPGA */
*M85XX_GPOUTDR(immr_val) = (orderval |(tempval & (~FPGA_DATA_MASK)));
*M85XX_GPOUTDR(immr_val) |= FPGA2_CCLK; /* set CCLK hi */
}
/* send the bits of the last double word */
for (i = 0; i < 120; i++)
{
*M85XX_GPOUTDR(immr_val) &= (~FPGA2_CCLK); /* set CCLK lo */
*M85XX_GPOUTDR(immr_val) |= FPGA2_CCLK; /* set CCLK hi */
}
taskDelay(10);
if (!(*M85XX_GPINDR(immr_val) & FPGA2_DONE ))
{
printf("\r\nfpga_download:fpga is not done.....");
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
return ERROR ;
}
/*set CS*/
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
/*reset_fpga2*/
}
return NB_DRV_OK;
}
/*************************************************************************************************/
/*************************************************************************************************/
/************************************FPGA下載相關接口**********************************************/
/*************************************************************************************************/
/*************************************************************************************************/
SYS_STATUS cpb_test_fpga_download(UINT8 chip_num)
{
FILE *fp1;
char* name_ptr;
UINT32 file_len1 = 0;
UINT8 *buf1;
UINT32 immr_val = /*(vxImmrGet() && 0xff000000)*/0x80000000;
sysClkRateSet(1000);
*M85XX_GPOUTDR(immr_val) |=FPGA2_CS;
*M85XX_GPOUTDR(immr_val) |=FPGA1_CS;
switch(chip_num)
{
case 0:/*MFP*/
name_ptr = "D:/iq_mux_top.bin";
break;
case 1:/*MFP*/
name_ptr = "D:/cpu_interface.bin";
break;
default:
return -1;
}
if ((fp1 = fopen(name_ptr,"r")) == NULL)/*目錄需要確認*/
{
printf("cannot open file!\n");
return NB_DRV_ERROR;
}
if (0 != fseek(fp1, 0, SEEK_END))
{
printf("fseek() returns error!\n");
fclose(fp1);
return NB_DRV_ERROR;
}
else
{
file_len1 = ftell(fp1);
printf("file 1 length is %d\n", file_len1);
}
if (0 != fseek(fp1, 0, SEEK_SET))
{
printf("fseek() returns error!\n");
fclose(fp1);
return NB_DRV_ERROR;
}
buf1 = malloc(file_len1);
if (NULL == buf1)
return NB_DRV_OK;
if (file_len1 != fread(buf1, 1, file_len1, fp1))
{
printf("fread() returns error!\n");
fclose(fp1);
free(buf1);
return NB_DRV_ERROR;
}
switch(chip_num)
{
case 0:
if (OK != cpb_fpga_download(0,buf1, file_len1))
{
printf("CPB FPGA: Not received the DONE!\n");
fclose(fp1);
free(buf1);
return NB_DRV_ERROR;
}
break;
case 1:
if (OK != cpb_fpga_download(1,buf1, file_len1))
{
printf("CPB FPGA: Not received the DONE!\n");
fclose(fp1);
free(buf1);
return NB_DRV_ERROR;
}
break;
default:
break;
}
fclose(fp1);
free(buf1);
return NB_DRV_OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -