/* write flag */ static ZERO_OR_ERROR FS_w_flag(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); BYTE cr; BYTE fl = pn->selected_filetype->data.c; OWQ_allocate_struct_and_pointer(owq_flag); OWQ_create_temporary(owq_flag, (char *) &cr, 1, 0x0201, pn); if (COMMON_read_memory_F0(owq_flag, 0, 0)) { return -EINVAL; } if (OWQ_Y(owq)) { if (cr & fl) { return 0; } } else { if ((cr & fl) == 0) { return 0; } } cr ^= fl; /* flip the bit */ if (OW_w_mem(&cr, 1, 0x0201, pn)) { return -EINVAL; } return 0; }
static GOOD_OR_BAD OW_r_mem(BYTE * p, size_t size, off_t offset, struct parsedname *pn) { OWQ_allocate_struct_and_pointer(owq_read); OWQ_create_temporary(owq_read, (char *) p, size, offset, pn); return COMMON_read_memory_crc16_AA(owq_read, 0, _1W_2450_PAGESIZE); }
static ZERO_OR_ERROR FS_r_set_alarm(struct one_wire_query *owq) { BYTE c; OWQ_allocate_struct_and_pointer(owq_alarm); OWQ_create_temporary(owq_alarm, (char *) &c, 1, 0x0200, PN(owq)); if (COMMON_read_memory_F0(owq_alarm, 0, 0)) { return -EINVAL; } OWQ_U(owq) = Avals[(c >> 3) & 0x07]; return 0; }
/* read flag */ static ZERO_OR_ERROR FS_r_flag(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); BYTE cr; BYTE fl = pn->selected_filetype->data.c; OWQ_allocate_struct_and_pointer(owq_flag); OWQ_create_temporary(owq_flag, (char *) &cr, 1, 0x0201, pn); if (COMMON_read_memory_F0(owq_flag, 0, 0)) { return -EINVAL; } OWQ_Y(owq) = (cr & fl) ? 1 : 0; return 0; }
/* read REAL DS2431 pages -- 8 bytes. */ static GOOD_OR_BAD OW_w_2Dpage(BYTE * data, size_t size, off_t offset, struct parsedname *pn) { off_t pageoff = offset & 0x07; BYTE p[4 + 8 + 2] = { _1W_WRITE_SCRATCHPAD, LOW_HIGH_ADDRESS(offset - pageoff), }; struct transaction_log tcopy[] = { TRXN_START, TRXN_WRITE(p, 3 + 8), TRXN_END, }; struct transaction_log tread[] = { TRXN_START, TRXN_WR_CRC16(p, 1, 3 + 8), TRXN_COMPARE(&p[4], data, size), TRXN_END, }; struct transaction_log tsram[] = { TRXN_START, TRXN_WRITE(p, 4), TRXN_DELAY(13), TRXN_END, }; if (size != 8) { // incomplete page OWQ_allocate_struct_and_pointer(owq_old); OWQ_create_temporary(owq_old, (char *) &p[3], 8, offset - pageoff, pn); if (COMMON_read_memory_F0(owq_old, 0, 0)) { return gbBAD; } } memcpy(&p[3 + pageoff], data, size); /* Copy to scratchpad */ RETURN_BAD_IF_BAD(BUS_transaction(tcopy, pn)) ; /* Re-read scratchpad and compare */ p[0] = _1W_READ_SCRATCHPAD; RETURN_BAD_IF_BAD(BUS_transaction(tread, pn)) ; /* Copy Scratchpad to SRAM */ p[0] = _1W_COPY_SCRATCHPAD; return BUS_transaction(tsram, pn) ; }
/* read 4 or 5 byte number */ static GOOD_OR_BAD OW_r_ulong(uint64_t * L, size_t size, off_t offset, struct parsedname *pn) { BYTE data[5] = { 0x00, 0x00, 0x00, 0x00, 0x00, }; OWQ_allocate_struct_and_pointer(owq_ulong); OWQ_create_temporary(owq_ulong, (char *) data, size, offset, pn); if (size > 5) { return gbBAD; } if (COMMON_read_memory_F0(owq_ulong, 0, 0)) { return gbBAD; } L[0] = ((uint64_t) data[0]) + (((uint64_t) data[1]) << 8) + (((uint64_t) data[2]) << 16) + (((uint64_t) data[3]) << 24) + (((uint64_t) data[4]) << 32); return gbGOOD; }