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

📄 halixp425.c

📁 INTEL IXP425的VXWORKS BSP
💻 C
字号:
#include "vxWorks.h"
#include "stdio.h"
#include "ixp425.h"
#include "ixdp425.h"
#include "ixp425Gpio.h"
#include "intLib.h"


#define IXP425_DS2401_GPIO  9

/* Following is get serial number from DS2401 device */
#define SET_BIT(data, bit)	((data) |= 0x1<<bit)
#define CLR_BIT(data, bit)	((data) &= ~(0x1<<bit))
#define GET_BIT(data, bit)	(((data) & (0x1<<bit))? 1 : 0)

extern void sysMicroDelay(int microseconds);

static char crc8_table[] = 
{
	0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
	157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
	35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
	190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
	70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
	219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
	101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
	248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
	140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
	17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
	175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
	50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
	202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
	87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
	233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
	116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
};

unsigned char sysMacBase[6]={0x00,0xe0,0x8e,0x54,0x53,0x52};	

char crc8(char *buf, int len)
{
	char crc = 0;

	while (len--)
	{
		crc = crc8_table[crc ^ *buf];
		buf++;
	}

	return crc;
}


/*************************************************
Init the DS2401 device
return 0 success
      -1 failure
***************************************************/
int SSN_Init()
{
	int level;
	int i;
	int present = 0;
	IXP425_GPIO_SIG val = 1;


	level = intLock();

	ixp425GPIOLineConfig(IXP425_DS2401_GPIO, IXP425_GPIO_OUT);
	
/*	SET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);
    CLR_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);	          */
	ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_HIGH);    
	ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_LOW);    
/*	sysMicroDelay(600);  */
	sysMicroDelay(1200);
	
/*	SET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);     */
	ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_HIGH);    
	
	sysMicroDelay(60*2);

	ixp425GPIOLineConfig(IXP425_DS2401_GPIO, IXP425_GPIO_IN);

	/* wait max 240us */
	for (i=0; i<24; i++)
	{
		sysMicroDelay(10*2);
		ixp425GPIOLineGet(IXP425_DS2401_GPIO, &val);		
/*    	if (!GET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_R))   */
    	if (!val)   
    	{
    		/* found device */
    		present = 1;
    		break;
    	}
	}
	intUnlock(level);
	
    if (!present)
   		printf("Warning: DS2401 not presented!\n");

	return present;
}

/******************************************************
 Read the serial number from the DS2401 Device
 After SSN_Init() is called, this function can be called.
 input   char * MacAddr
 return  0      success
        -1      failure
*******************************************************/
int SSN_ReadSerialNumber(char * macAddr) /*unsigned char * MacAddr)*/
{
	int lockKey;
	int i;	
	IXP425_GPIO_SIG val = 0;
	char sioBit[8];	

	memset(sioBit, 0, 8);
	
	lockKey=intLock();
	if (!SSN_Init())
	{
		intUnlock(lockKey);
		return ERROR;
	}
	sysMicroDelay(480*2);
	
	ixp425GPIOLineConfig(IXP425_DS2401_GPIO, IXP425_GPIO_OUT);
	
	/* Issue read rom command */
	for(i=0; i<8; i++)
	{
		if((0x33>>i)&0x1)
		{
			/* write one */
/*			CLR_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);   */
			ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_LOW);
			sysMicroDelay(5*2);
/*			SET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);  */
			ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_HIGH);
			sysMicroDelay(90*2);
		}
		else
		{
			/* write zero */
/*			CLR_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);      */
			ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_LOW);
			sysMicroDelay(80*2);
/*			SET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);    */
			ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_HIGH);			
			sysMicroDelay(5*2);
		}
	}



	/* Read 64Bits rom data */
	for(i=0; i<64; i++)
	{
/*		CLR_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);
		SET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_W);  */
		ixp425GPIOLineConfig(IXP425_DS2401_GPIO, IXP425_GPIO_OUT);

		ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_LOW);
		ixp425GPIOLineSet(IXP425_DS2401_GPIO, IXP425_GPIO_HIGH);

		sysMicroDelay(7*2); /* wait for data pin stable */
		
		ixp425GPIOLineConfig(IXP425_DS2401_GPIO, IXP425_GPIO_IN);		
		ixp425GPIOLineGet(IXP425_DS2401_GPIO, &val);
		sysMicroDelay(90*2);			
/*		sioBit[i/8] |= GET_BIT(*(char *)HW_DS2401_ADDR, HW_MAC_ADDR_R) << (i%8);  */
		sioBit[i/8] |= val << (i%8);  
	}
	
	intUnlock(lockKey);

	/* Check CRC */
	if (crc8(sioBit, sizeof(sioBit)-1) != sioBit[7])
	{
		printf("Warning: Serial number CRC error!\n");
		return ERROR;
	}
	
	memcpy(macAddr, &sioBit[1], 6);
    
	return OK;
}


int  sysMacGet()
{
	int ret_val;
	ret_val=SSN_ReadSerialNumber(sysMacBase);
	return(ret_val);
}

int debug_sysMacGet()
{
	int ret_val;
	printf("sysMacBase[0]=%x; sysMacBase[1]=%x; sysMacBase[2]=%x; sysMacBase[3]=%x; sysMacBase[4]=%x; sysMacBase[5]=%x\n",
		sysMacBase[0], sysMacBase[1], sysMacBase[2], sysMacBase[3], sysMacBase[4], sysMacBase[5]);
	ret_val=SSN_ReadSerialNumber(sysMacBase);
	printf("sysMacBase[0]=%x; sysMacBase[1]=%x; sysMacBase[2]=%x; sysMacBase[3]=%x; sysMacBase[4]=%x; sysMacBase[5]=%x\n",
		sysMacBase[0], sysMacBase[1], sysMacBase[2], sysMacBase[3], sysMacBase[4], sysMacBase[5]);	
	printf("return value: %d \n", ret_val);
	return(ret_val);
}

⌨️ 快捷键说明

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