📄 halixp425.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 + -