⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meclib.c

📁 vxworks MPC8541 BSP
💻 C
📖 第 1 页 / 共 4 页
字号:

UINT8 g_ucThermoIsOK = 0;

/************************************************************************
*FUNCTION NAME	: b_WriteThermometer									*
*DESCRIPTION	: 向温度传感器发送命令或数据							*
*INPUT			: v_ucCommand:命令或数据								*
************************************************************************/
void b_WriteThermometer(UINT8 v_ucCommand)
{
	UINT8 ucI = 0,ucDat = 0;

	int immrVal = vxImmrGet();
	
	*M8260_IOP_PDDIR(immrVal)  |= DQ_MASK;	 /* output*/
	   
	for(ucI = 0; ucI < 8; ucI ++)
	{
		 ucDat = (v_ucCommand >> ucI) & 0x01;
		 if(ucDat != 0)
		 {
			  *M8260_IOP_PDDAT(immrVal)  |= DQ_MASK; /*DQ置1*/
		 }
		 else
		 {
			  *M8260_IOP_PDDAT(immrVal)  &= ~(DQ_MASK);/*DQ置0*/
		 }
		 
		 *M8260_IOP_PDDAT(immrVal)	&= ~(CLK_MASK); /*CLK置低*/
		 *M8260_IOP_PDDAT(immrVal) |= CLK_MASK; /*CLK置高*/
	}

}

/************************************************************************
*FUNCTION NAME	: Sub_ReadThermometer									*
*DESCRIPTION	: 从温度传感器读取数据									*
*INPUT			: v_ucCommand:命令或数据								*
************************************************************************/
void b_ReadThermometer(UINT16 *v_pwData)
{
	UINT8  ucI = 0;
	UINT32 wTmpDat = 0;

	int immrVal = vxImmrGet();
	
	*M8260_IOP_PDDIR(immrVal)  &= ~(DQ_MASK); /*input*/
	
	for(ucI = 0; ucI < 9; ucI ++)
	{
		*M8260_IOP_PDDAT(immrVal)  &= ~(CLK_MASK); /*CLK置低*/
		wTmpDat = *M8260_IOP_PDDAT(immrVal) & DQ_MASK;
		*M8260_IOP_PDDAT(immrVal)  |= CLK_MASK; /*CLK置高*/
		
		if(wTmpDat != 0)
		{
		   *v_pwData |= (0x01 << ucI);
		}
		else
		{
		   *v_pwData &= ~(0x01 << ucI);
		}
	}

}


UINT8 b_ThermometerInit()
{
	UINT16  wData = 0;
	UINT8  ucData = 0;
	UINT8  ucReturn = OK;

	int immrVal = vxImmrGet();
		
	*M8260_IOP_PDPAR(immrVal)  &= ~(DQ_MASK | CLK_MASK | RST_MASK);  /*general I/O*/	
	*M8260_IOP_PDDIR(immrVal)  |= (CLK_MASK | RST_MASK);   /* output*/
	*M8260_IOP_PDDAT(immrVal)  &= ~(RST_MASK); /*RST置低*/
	
	*M8260_IOP_PDDAT(immrVal)  |= CLK_MASK; /*CLK置高*/
	*M8260_IOP_PDDAT(immrVal)  |= RST_MASK; /*RST置高*/     
	b_WriteThermometer(READ_CONFIG);
	b_ReadThermometer(&wData);
    *M8260_IOP_PDDAT(immrVal)  &= ~(RST_MASK); /*RST置低*/

    wData &= 0x00FF;
	/*printf("DS1620's CONFIG: 0x%xh\n.",wData);*/
	
	if((wData & 0x0003)!= 0x0002) /*温度传感器的配置数据需要改变*/
	{
		ucData = (UINT8) wData;
		ucData |= 0x02; /*设为CPU方式*/
		ucData &= 0xFE; /*连续转换模式*/
		
		*M8260_IOP_PDDAT(immrVal)  |= CLK_MASK; /*CLK置高*/
		*M8260_IOP_PDDAT(immrVal)  |= RST_MASK; /*RST置高*/    
		b_WriteThermometer(WRITE_CONFIG);
		b_WriteThermometer(ucData);
		*M8260_IOP_PDDAT(immrVal)  &= ~(RST_MASK); /*RST置低*/
		
		taskDelay(1);
		
		*M8260_IOP_PDDAT(immrVal)  |= CLK_MASK; /*CLK置高*/
		*M8260_IOP_PDDAT(immrVal)  |= RST_MASK; /*RST置高*/    
		b_WriteThermometer(READ_CONFIG);
		b_ReadThermometer(&wData);
		*M8260_IOP_PDDAT(immrVal)  &= ~(RST_MASK); /*RST置低*/
		wData &= 0x00FF;
		
		if((wData & 0x0003) == 0x02)
		{
			/*printf("DS1620's CONFIG successfully changed to: 0x%xh.\n",wData);*/
		}
		else
		{
			ucReturn = ERROR;
			printf("Failed to change DS1620's CONFIG.\n" );
		}
	}
	
	/*让DS1620开始工作*/
	if(ucReturn == OK)
	{
		 *M8260_IOP_PDDAT(immrVal)	|= CLK_MASK; /*CLK置高*/
		 *M8260_IOP_PDDAT(immrVal)	|= RST_MASK; /*RST置高*/	
		 b_WriteThermometer(START_CONVERT);
		 *M8260_IOP_PDDAT(immrVal)	&= ~(RST_MASK); /*RST置低*/
		
		 g_ucThermoIsOK = 1;
	}
	else
	{
		 g_ucThermoIsOK = 0;
	}

	return ucReturn;
	/*Checking Config*/
}


/************************************************************************
*FUNCTION NAME	: bspGetTemperature									*
*DESCRIPTION	: 采集温度												*
************************************************************************/
UINT8 bspGetTemperature(INT16 *vpResult)
{
	UINT8 ucReturn = OK;

	int immrVal = vxImmrGet();
	UINT16 wData = 0;
	UINT8 ucData = 0;
    
    if(g_ucThermoIsOK == 0)
        b_ThermometerInit();
    
	if(g_ucThermoIsOK != 1)
	{
		 *vpResult = TEMPERATURE_FAILURE;
		 ucReturn = ERROR;
	}
	else
	{
		 *M8260_IOP_PDDAT(immrVal)	|= CLK_MASK; /*CLK置高*/
		 *M8260_IOP_PDDAT(immrVal)	|= RST_MASK; /*RST置高*/	
		 b_WriteThermometer(READ_TEMPRERATURE);
		 b_ReadThermometer(&wData);
		 *M8260_IOP_PDDAT(immrVal)	&= ~(RST_MASK); /*RST置低*/
		
		 wData = (wData >> 1) & 0x00FF;
		 ucData = (UINT8) wData;
		 *vpResult = (INT16) ucData; 
	}

	return ucReturn;
}

/*******************************************************************************
*                               电源相关接口                                   *
*******************************************************************************/

void Power1_Run_Led(BOOL flag)
{
}

void Power2_Run_Led(BOOL flag)
{
}

void Power3_Run_Led(BOOL flag)
{
}

void Power3_Alarm_Led(BOOL flag)
{
}

void Power1_Alarm_Led(BOOL flag)
{
}

void Power2_Alarm_Led(BOOL flag)
{
}

UINT8 CheckPowerState (void)
{
    return 0;
}

void CheckPowerStatus (void)
{
}

void b_GetPowerStatus (unsigned char power[])
{
}



/*******************************************************************************
* GetLinkStatus
*
*/

STATUS GetLinkStatus (void)
    {
    return (OK);

    }

/*******************************************************************************
* b_getMngLinkStatus
*
* 返回mp主控制的网卡的link状态,主板根据链路状态来指示,备板总是报DOWN的状态
*
* RETURNS: 0 - down
*          1 - up
*/
UINT8 b_getMngLinkStatus (void)
    {
    if (boardIsMaster() == TRUE)
        {
        if (GetLinkStatus() == ERROR)
            return BSP_LINK_DOWN;
        else
            return BSP_LINK_UP; 
        }
    else
        return BSP_LINK_DOWN;       
    }



/*******************************************************************************
*                             时间相关                                   *
******************************************************************************/

int bspClockInit (void)
    {
    struct tm   tm;
    time_t      t;
    struct timespec tv;

    /* set clock to 2000/01/01, 00:00:00 */
    tm.tm_mday = 1;
    tm.tm_mon  = 0;
    tm.tm_year = 2000 - 1900;
    tm.tm_sec  = 0;
    tm.tm_min  = 0;
    tm.tm_hour = 0;
    tm.tm_wday = 0;
    tm.tm_yday = 0;
    tm.tm_isdst= 0;

    t = mktime(&tm);
    tv.tv_sec  = t;
    tv.tv_nsec = 0;

    if (clock_settime(CLOCK_REALTIME, &tv) == ERROR)
        {
        printf ("clock_settime err\n");
        return (ERROR);
        }

    /*
    printf ("%d-%d-%d %d:%d:%d wday=%d yday=%d isdst=%d\n",
            tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
            tm.tm_hour, tm.tm_min, tm.tm_sec,
            tm.tm_wday, tm.tm_yday, tm.tm_isdst);
    */

    return (OK);
    }



/*******************************************************************************
* sysSetDateTime
*/
void sysSetDateTime (struct tm * DateTime)
    {

    }

/*******************************************************************************
* sysGetDateTime
*/
STATUS sysGetDateTime (struct tm * DateTime)
    {      
    return (ERROR);
    }

STATUS b_SetFileSystemClock (void)
    {
    return (bspClockInit ()); 
    }

/*******************************************************************************
* sysGetDosDateTime - read RTC datetime
* Return: OK, or ERROR if RTC is fault
*/
void sysGetDosDateTime (DOS_DATE_TIME *dosDateTime)
    {
    struct tm    DateTime;

    dosDateTime->dosdt_year  = 2000;	/* default year */
    dosDateTime->dosdt_month = 1;	/* default month */
    dosDateTime->dosdt_day   = 1;	/* default day */
    dosDateTime->dosdt_hour  = 0;	/* default hour */
    dosDateTime->dosdt_minute= 0;	/* default minute */
    dosDateTime->dosdt_second= 0;	/* default second */

    /*sysGetDateTime(&DateTime);*/
    if (OK == sysGetDateTime(&DateTime))
        {
        dosDateTime->dosdt_year  = DateTime.tm_year;	/* current year */
        dosDateTime->dosdt_month = DateTime.tm_mon;	/* current month */
        dosDateTime->dosdt_day   = DateTime.tm_mday;	/* current day */
        dosDateTime->dosdt_hour  = DateTime.tm_hour;	/* current hour */
        dosDateTime->dosdt_minute= DateTime.tm_min;	/* current minute */
        dosDateTime->dosdt_second= DateTime.tm_sec;	/* current second */
        }
    }

/*##############################################################################
#                               新增接口/板间通讯                              #
##############################################################################*/


/* for  bootShell*/
STATUS sysRtcInit(void)
{
    return (OK);
}

#if 0
/*************************************************************
 *  bsp_BurnBoot - update bootrom with the specified contents.
 *  
 *  RETURNS: OK(0), or ERROR(-1)
 */

extern int  WriteToBootFlash(unsigned char *src,int len);

int bsp_BurnBoot(char *pcBuf, unsigned long vLen,int ifcheck)
{
	int rc;

    if(ifcheck)
    {
        BOOTVER  ori_bootver, new_bootver;

        /*校验要更新的boot文件是否正确*/
        if (bsp_getRuningBootVerInfo (&ori_bootver) != OK)
            return ERROR;
    
        if (bsp_getBootVerInRam (pcBuf, vLen, &new_bootver) != OK)
            return ERROR;
    
        if (strcmp(new_bootver.fnctVerName, ori_bootver.fnctVerName) != 0)
        {
           printf ("bootrom tag mismatch (%s vs %s)\n",
                     new_bootver.fnctVerName, ori_bootver.fnctVerName);
           return ERROR;
        }
    
        if(ERROR == bsp_ChkBootVer(pcBuf, vLen))
        {
            printf ("bootrom in ram check error\n");
            return ERROR;
        }
    }
    /*开始将写入boot芯片中*/

    rc = WriteToBootFlash (pcBuf,vLen); /*update boot FANLIHAN*/

    switch(rc)
    {
        case 0:
            printf ("  Boot ROM update successfully \n");
            break; 
        case -1 :
            printf ("  Boot ROM update failure : The ic isn't amd  or sst type chip\n");
            return (ERROR);    
        case -2 :
            printf ("  Boot ROM update failure : can't erase\n");
            return (ERROR);    
        case -3 :
            printf ("  Boot ROM update failure : can't program\n");
            return (ERROR);    
        default:
            printf ("  Boot ROM update failure : other error\n");
            return (ERROR);    
    }    

    if(ifcheck)
    {
       /*对写入到boot芯片的中文件进行校验和检查*/
       if(ERROR == bsp_ChkRuningBootVer())
       {
           printf ("Write bootrom check Failed!!\n");
           return ERROR;
       }
    }
    return OK;
}
#endif

/*临时,带平台修改后删除*/

/*******************************************************************************
* b_WatchdogEnable - config and startup Watchdog
*/

void b_WatchdogEnable (int count1s)
{
    count1s = count1s;
  /*  mecRegWrite (0x44, 0x01);*/
    return;
}

/*******************************************************************************
* b_WatchdogDisable - disable watchdog
*/
void b_WatchdogDisable (void)
    {
    mecRegWrite (0x44, 0x0);
    }

/*******************************************************************************
* b_WatchdogClear - clear Watchdog
*/

void b_WatchdogClear (void)
    {
    static UINT8 flag;

    flag = flag ? 0x0 : 0x1;
    mecRegWrite (0x40, flag);
    }


/*******************************************************************************
* b_getBoardType
*/
UINT32 b_getBoardType (void)
{
    UINT32 BoardType = 0;    

    BoardType = (mecRegRead(0x00) << 8) | (mecRegRead(0x04) & 0x1F); 	
    return BoardType;

}

char *bsp_GetBoardName(void)
{
	return "GCSA";
}

/*******************************************************************************
* b_cardReset - 复位本板
*/
void b_cardReset (void)
{
    bsp_ResetBoard();
}


int b_getNvramSize (void)
    {
    return NVRAM_8540_SIZE;
    }

int b_getFlashSize (void)
    {
    return FLASH_8540_SIZE;
    }
/*******************************************************************************
* b_getCpldVer
*/
UINT8 b_getCpldVer (void)
{
    return (mecRegRead(0x08));/*洪涛:2006-10-25:经过验证,原先 的地址错误:    return (mecRegRead(0x0C));*/
}

/*******************************************************************************
* b_getPcbVer
*/
UINT8 b_getPcbVer (void)
{
    UINT8 val;
    
    val = mecRegRead(0x04);
    val = (val & 0xE0) >> 5;
    return (val);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -