/* Allow the strong pullup to be disabled, but default to enabled. *Ifitwasdisabledaparasitepowereddevicemightnotgettherequired *currenttocopythedatafromthescratchpadtoEEPROM.Ifitisenabled *parasitepowereddeviceshaveabetterchanceofgettingthecurrent *required.
*/ staticint w1_strong_pullup = 1;
module_param_named(strong_pullup, w1_strong_pullup, int, 0);
/* Read the scratchpad and verify */ if (w1_reset_select_slave(sl)) return -1;
w1_write_8(sl->master, W1_F1C_READ_SCRATCH);
w1_read_block(sl->master, rdbuf, len + 3);
/* Compare what was read against the data written */ if ((rdbuf[0] != wrbuf[1]) || (rdbuf[1] != wrbuf[2]) ||
(rdbuf[2] != es) || (memcmp(data, &rdbuf[3], len) != 0)) return -1;
/* Copy the scratchpad to EEPROM */ if (w1_reset_select_slave(sl)) return -1;
wrbuf[0] = W1_F1C_COPY_SCRATCH;
wrbuf[3] = es;
for (i = 0; i < sizeof(wrbuf); ++i) { /* *issue10msstrongpullup(ordelay)onthelastbyte *forwritingthedatafromthescratchpadtoEEPROM
*/ if (w1_strong_pullup && i == sizeof(wrbuf)-1)
w1_next_pullup(sl->master, tm);
w1_write_8(sl->master, wrbuf[i]);
}
if (!w1_strong_pullup)
msleep(tm);
if (w1_enable_crccheck) { /* invalidate cached data */
f1C->validcrc &= ~(1 << (addr >> W1_PAGE_BITS));
}
/* Reset the bus to wake up the EEPROM (this may not be needed) */
w1_reset_bus(sl->master);
{ struct w1_slave *sl = kobj_to_w1_slave(kobj); int addr, len, idx;
count = w1_f1C_fix_count(off, count, W1_EEPROM_SIZE); if (count == 0) return0;
if (w1_enable_crccheck) { /* can only write full blocks in cached mode */ if ((off & W1_PAGE_MASK) || (count & W1_PAGE_MASK)) {
dev_err(&sl->dev, "invalid offset/count off=%d cnt=%zd\n",
(int)off, count); return -EINVAL;
}
/* make sure the block CRCs are valid */ for (idx = 0; idx < count; idx += W1_PAGE_SIZE) { if (crc16(CRC16_INIT, &buf[idx], W1_PAGE_SIZE)
!= CRC16_VALID) {
dev_err(&sl->dev, "bad CRC at offset %d\n",
(int)off); return -EINVAL;
}
}
}
mutex_lock(&sl->master->mutex);
/* Can only write data to one page at a time */
idx = 0; while (idx < count) {
addr = off + idx;
len = W1_PAGE_SIZE - (addr & W1_PAGE_MASK); if (len > (count - idx))
len = count - idx;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.