//-------------------------------------------------------------------------- // Send 8 bits of communication to the 1-Wire Net and verify that the // 8 bits read from the 1-Wire Net is the same (write operation). // The parameter 'sendbyte' least significant 8 bits are used. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number is provided to // indicate the symbolic port number. // 'sendbyte' - 8 bits to send (least significant byte) // // Returns: TRUE: bytes written and echo was the same // FALSE: echo was not the same // SMALLINT owTouchByteUSB(int portnum, SMALLINT sendbyte) { SETUP_PACKET setup; ushort nBytes; uchar buf[2]; SMALLINT ret = 0; // make sure strong pullup is not on if (USBLevel[portnum] == MODE_STRONG5) owLevelUSB(portnum, MODE_NORMAL); // set to do touchbyte setup.RequestTypeReservedBits = 0x40; setup.Request = COMM_CMD; setup.Value = COMM_BYTE_IO | COMM_IM; setup.Index = sendbyte & 0xFF; setup.Length = 0; setup.DataOut = FALSE; // call the libusb driver ret = usb_control_msg(usb_dev_handle_list[portnum], setup.RequestTypeReservedBits, setup.Request, setup.Value, setup.Index, NULL, setup.Length, TIMEOUT_LIBUSB); if (ret < 0) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return 0; } else { // success, read the result nBytes = 1; if (DS2490Read(usb_dev_handle_list[portnum], buf, &nBytes)) return buf[0]; else { OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return 0; } } }
//-------------------------------------------------------------------------- // Send 8 bits of communication to the 1-Wire Net and verify that the // 8 bits read from the 1-Wire Net is the same (write operation). // The parameter 'sendbyte' least significant 8 bits are used. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number is provided to // indicate the symbolic port number. // 'sendbyte' - 8 bits to send (least significant byte) // // Returns: TRUE: bytes written and echo was the same // FALSE: echo was not the same // SMALLINT owTouchByte(int portnum, SMALLINT sendbyte) { SETUP_PACKET setup; ULONG nOutput = 0; WORD nBytes; BYTE buf[2]; // make sure strong pullup is not on if (USBLevel[portnum] == MODE_STRONG5) owLevel(portnum, MODE_NORMAL); // set to do touchbyte setup.RequestTypeReservedBits = 0x40; setup.Request = COMM_CMD; setup.Value = COMM_BYTE_IO | COMM_IM; setup.Index = sendbyte & 0xFF; setup.Length = 0; setup.DataOut = FALSE; // call the driver if (!DeviceIoControl(usbhnd[portnum], DS2490_IOCTL_VENDOR, &setup, sizeof(SETUP_PACKET), NULL, 0, &nOutput, NULL)) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return 0; } else { // success, read the result nBytes = 1; if (DS2490Read(usbhnd[portnum], buf, &nBytes)) return buf[0]; else { OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return 0; } } }
//-------------------------------------------------------------------------- // Read 1 bit of communication from the 1-Wire net and verify that the // response matches the 'applyPowerResponse' bit and apply power delivery // to the 1-Wire net. Note that some implementations may apply the power // first and then turn it off if the response is incorrect. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to // OpenCOM to indicate the port number. // 'applyPowerResponse' - 1 bit response to check, if correct then start // power delivery // // Returns: TRUE: bit written and response correct, strong pullup now on // FALSE: response incorrect // SMALLINT owReadBitPower(int portnum, SMALLINT applyPowerResponse) { SETUP_PACKET setup; ULONG nOutput = 0; WORD nBytes; BYTE buf[2]; // make sure strong pullup is not on if (USBLevel[portnum] == MODE_STRONG5) owLevel(portnum, MODE_NORMAL); // enable the strong pullup pulse setup.RequestTypeReservedBits = 0x40; setup.Request = MODE_CMD; setup.Value = MOD_PULSE_EN; setup.Index = ENABLEPULSE_SPUE; setup.Length = 0x00; setup.DataOut = FALSE; // call the driver if (!DeviceIoControl(usbhnd[portnum], DS2490_IOCTL_VENDOR, &setup, sizeof(SETUP_PACKET), NULL, 0, &nOutput, NULL)) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } // set to do touchbit setup.RequestTypeReservedBits = 0x40; setup.Request = COMM_CMD; setup.Value = COMM_BIT_IO | COMM_IM | COMM_SPU | COMM_D; setup.Index = 0; setup.Length = 0; setup.DataOut = FALSE; // call the driver if (!DeviceIoControl(usbhnd[portnum], DS2490_IOCTL_VENDOR, &setup, sizeof(SETUP_PACKET), NULL, 0, &nOutput, NULL)) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } else { // now strong pullup is enabled USBLevel[portnum] = MODE_STRONG5; // success, read the result nBytes = 1; if (DS2490Read(usbhnd[portnum], buf, &nBytes)) { // check response if (buf[0] != applyPowerResponse) { owLevel(portnum, MODE_NORMAL); return FALSE; } else return TRUE; } else { OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } } }
//-------------------------------------------------------------------------- // Read 1 bit of communication from the 1-Wire net and verify that the // response matches the 'applyPowerResponse' bit and apply power delivery // to the 1-Wire net. Note that some implementations may apply the power // first and then turn it off if the response is incorrect. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to // OpenCOM to indicate the port number. // 'applyPowerResponse' - 1 bit response to check, if correct then start // power delivery // // Returns: TRUE: bit written and response correct, strong pullup now on // FALSE: response incorrect // SMALLINT owReadBitPowerUSB(int portnum, SMALLINT applyPowerResponse) { SETUP_PACKET setup; ushort nBytes; uchar buf[2]; SMALLINT ret = 0; // make sure strong pullup is not on if (USBLevel[portnum] == MODE_STRONG5) owLevelUSB(portnum, MODE_NORMAL); // enable the strong pullup pulse setup.RequestTypeReservedBits = 0x40; setup.Request = MODE_CMD; setup.Value = MOD_PULSE_EN; setup.Index = ENABLEPULSE_SPUE; setup.Length = 0x00; setup.DataOut = FALSE; // call the libusb driver ret = usb_control_msg(usb_dev_handle_list[portnum], setup.RequestTypeReservedBits, setup.Request, setup.Value, setup.Index, NULL, setup.Length, TIMEOUT_LIBUSB); if (ret < 0) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } // set to do touchbit setup.RequestTypeReservedBits = 0x40; setup.Request = COMM_CMD; setup.Value = COMM_BIT_IO | COMM_IM | COMM_SPU | COMM_D; setup.Index = 0; setup.Length = 0; setup.DataOut = FALSE; // call the libusb driver ret = usb_control_msg(usb_dev_handle_list[portnum], setup.RequestTypeReservedBits, setup.Request, setup.Value, setup.Index, NULL, setup.Length, TIMEOUT_LIBUSB); if (ret < 0) { // failure OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } else { // now strong pullup is enabled USBLevel[portnum] = MODE_STRONG5; // success, read the result nBytes = 1; if (DS2490Read(usb_dev_handle_list[portnum], buf, &nBytes)) { // check response if (buf[0] != applyPowerResponse) { owLevelUSB(portnum, MODE_NORMAL); return FALSE; } else return TRUE; } else { OWERROR(OWERROR_ADAPTER_ERROR); AdapterRecover(portnum); return FALSE; } } }
//-------------------------------------------------------------------------- // The 'owNext' function does a general search. This function // continues from the previos search state. The search state // can be reset by using the 'owFirst' function. // This function contains one parameter 'alarm_only'. // When 'alarm_only' is TRUE (1) the find alarm command // 0xEC is sent instead of the normal search command 0xF0. // Using the find alarm command 0xEC will limit the search to only // 1-Wire devices that are in an 'alarm' state. // // 'portnum' - number 0 to MAX_PORTNUM-1. This number is provided to // indicate the symbolic port number. // 'do_reset' - TRUE (1) perform reset before search, FALSE (0) do not // perform reset before search. // 'alarm_only' - TRUE (1) the find alarm command 0xEC is // sent instead of the normal search command 0xF0 // // Returns: TRUE (1) : when a 1-Wire device was found and it's // Serial Number placed in the global SerialNum[portnum] // FALSE (0): when no new device was found. Either the // last search was the last device or there // are no devices on the 1-Wire Net. // SMALLINT owNext(int portnum, SMALLINT do_reset, SMALLINT alarm_only) { SETUP_PACKET setup; short rt=FALSE,i,ResetSearch=FALSE; BYTE rom_buf[16]; BYTE ret_buf[16]; WORD buf_len; uchar lastcrc8; WORD nBytes = 8; ULONG nOutput = 0; long limit; STATUS_PACKET status; BYTE nResult; // if the last call was the last one if (LastDevice[portnum]) { // reset the search LastDiscrepancy[portnum] = 0; LastDevice[portnum] = FALSE; LastFamilyDiscrepancy[portnum] = 0; return FALSE; } // check if reset first is requested if (do_reset) { // reset the 1-wire // extra reset if last part was a DS1994/DS2404 (due to alarm) if ((SerialNum[portnum][0] & 0x7F) == 0x04) owTouchReset(portnum); // if there are no parts on 1-wire, return FALSE if (!owTouchReset(portnum)) { // reset the search LastDiscrepancy[portnum] = 0; LastFamilyDiscrepancy[portnum] = 0; OWERROR(OWERROR_NO_DEVICES_ON_NET); return FALSE; } } // build the rom number to put to the USB chip for (i = 0; i < 8; i++) rom_buf[i] = SerialNum[portnum][i]; // take into account LastDiscrepancy if (LastDiscrepancy[portnum] != 0xFF) { if (LastDiscrepancy[portnum] > 0) bitacc(WRITE_FUNCTION,1,(short)(LastDiscrepancy[portnum] - 1),rom_buf); for (i = LastDiscrepancy[portnum]; i < 64; i++) bitacc(WRITE_FUNCTION,0,i,rom_buf); } // put the ROM ID in EP2 nBytes = 8; if (!DS2490Write(usbhnd[portnum], rom_buf, &nBytes)) { AdapterRecover(portnum); return FALSE; } // setup for search command call setup.RequestTypeReservedBits = 0x40; setup.Request = COMM_CMD; setup.Value = COMM_SEARCH_ACCESS | COMM_IM | COMM_SM | COMM_F | COMM_RTS; // the number of devices to read (1) with the search command setup.Index = 0x0100 | (((alarm_only) ? 0xEC : 0xF0) & 0x00FF); setup.Length = 0; setup.DataOut = FALSE; // call the driver if (!DeviceIoControl(usbhnd[portnum], DS2490_IOCTL_VENDOR, &setup, sizeof(SETUP_PACKET), NULL, 0, &nOutput, NULL)) { // failure AdapterRecover(portnum); return FALSE; } // set a time limit limit = msGettick() + 200; // loop to wait on EP3 ready (device will go idle) do { // read the status to see if the pulse has been stopped if (!DS2490GetStatus(usbhnd[portnum], &status, &nResult)) { // failure break; } else { // look for any fail conditions for (i = 0; i < nResult; i++) { // only check for error conditions when the condition is not a ONEWIREDEVICEDETECT if (status.CommResultCodes[i] != ONEWIREDEVICEDETECT) { // failure break; } } } } while (((status.StatusFlags & STATUSFLAGS_IDLE) == 0) && (limit > msGettick())); // check results of the waite for idel if ((status.StatusFlags & STATUSFLAGS_IDLE) == 0) { AdapterRecover(portnum); return FALSE; } // check for data if (status.ReadBufferStatus > 0) { // read the load buf_len = 16; if(!DS2490Read(usbhnd[portnum], ret_buf, &buf_len)) { AdapterRecover(portnum); return FALSE; } // success, get rom and desrepancy LastDevice[portnum] = (buf_len == 8); // extract the ROM (and check crc) setcrc8(portnum,0); for (i = 0; i < 8; i++) { SerialNum[portnum][i] = ret_buf[i]; lastcrc8 = docrc8(portnum,ret_buf[i]); } // crc OK and family code is not 0 if (!lastcrc8 && SerialNum[portnum][0]) { // loop through the descrepancy to get the pointers for (i = 0; i < 64; i++) { // if descrepancy if (bitacc(READ_FUNCTION,0,i,&ret_buf[8]) && (bitacc(READ_FUNCTION,0,i,&ret_buf[0]) == 0)) { LastDiscrepancy[portnum] = i + 1; } } rt = TRUE; } else { ResetSearch = TRUE; rt = FALSE; } } // check if need to reset search if (ResetSearch) { LastDiscrepancy[portnum] = 0xFF; LastDevice[portnum] = FALSE; for (i = 0; i < 8; i++) SerialNum[portnum][i] = 0; } return rt; }