I would need some help to understand why I can’t write to an DS2433 eeprom.
System information:
BBB Industrial board
Debian 10 (Buster IoT Image 2020-04-06)
Hardware attached are DS2482 i2c to w1 interface and DS2433 eeprom.
Commands executed to set-up system:
$ modprobe ds2482
$ echo ds2482 0x18 > /sys/bus/i2c/devices/i2c-1/new_device
$ modprobe wire
I can read the eeprom by executing
$ cd /sys/bus/w1/devices/23-000002eddd9b
$ cat eeprom | hexdump
Getting this far I assume hardware is correct and drivers are loaded correctly.
debian@beaglebone:/sys/bus/w1/devices/23-000002eddd9b$ ls
driver eeprom id name power subsystem uevent
Should here be a directory called w1_slave?
I see such a directory on some web pages searching for similar problems with w1.
Now to the problem.
Executing the following command will fail:
debian@beaglebone:/sys/bus/w1/devices/23-000002eddd9b$ sudo cat /home/debian/file > eeprom
[sudo] password for debian:
cat: write error: Invalid argument
To me the error looks like the device doesn’t have a write function implemented,
however looking at the source it looks like it does.
$ dmesg | grep w1
[2329228.747219] w1_master_driver w1_bus_master1: Attaching one wire slave 23.000002eddd9b crc c8
[2493821.327176] w1_slave_driver 23-000002eddd9b: invalid offset/count off=0 cnt=140
[2514308.615437] w1_slave_driver 23-000002eddd9b: invalid offset/count off=0 cnt=140
Is there some kind of write protect that needs to be handled?
Wasn’t the problem that the redirection of output by “>” was outside the sudo command
The “echo” is not needed, only
sudo sh -c “cat /home/debian/file > eeprom”
Also the copy command
cp -T source destination
so…
sudo cp -T /home/debian/file eeprom
Thank you (and sorry for the double post) !
However, I still have no luck writing to the eeprom.
I have tried a couple of variations of the commands but I get error even if logged in as root.
debian@beaglebone:/sys/bus/w1/devices/23-000002eddd9b$ sudo sh -c “echo ‘cat /home/debian/file’ > eeprom”
sh: 1: echo: echo: I/O error
debian@beaglebone:/sys/bus/w1/devices/23-000002eddd9b$ su
Password:
root@beaglebone:/sys/bus/w1/devices/23-000002eddd9b# echo ‘cat /home/debian/file’ > eeprom
bash: echo: write error: Invalid argument
root@beaglebone:/sys/bus/w1/devices/23-000002eddd9b# cat /home/debian/file > eeprom
cat: write error: Invalid argument
root@beaglebone:/sys/bus/w1/devices/23-000002eddd9b# exit
exit
debian@beaglebone:/sys/bus/w1/devices/23-000002eddd9b$ sudo cp -T /home/debian/file eeprom
cp: error writing ‘eeprom’: Invalid argument
fredag 25 september 2020 kl. 17:52:55 UTC+2 skrev robert.sty...@gmail.com:
Does
ls /sys/bus/w1/devices/23-000002eddd9b
still show eeprom ?
If not, what does
ls /sys/bus/w1/devices
show you?
I prefer to run commands from my home director, you can change to your home with ‘cd ~’
Yes, it does still show eeprom
debian@beaglebone:~$ ls /sys/bus/w1/devices/23-000002eddd9b
driver eeprom id name power subsystem uevent
debian@beaglebone:~$ ls /sys/bus/w1/devices/
23-000002eddd9b w1_bus_master1
debian@beaglebone:~$
debian@beaglebone:~$ ls -al /sys/bus/w1/devices/23-000002eddd9b/
total 0
drwxrwxr-x 3 root gpio 0 Sep 29 14:00 .
drwxrwxr-x 4 root gpio 0 Sep 29 14:00 …
lrwxrwxrwx 1 root gpio 0 Sep 29 14:00 driver → …/…/…/bus/w1/drivers/w1_slave_driver
-rw-rw-r-- 1 root gpio 512 Sep 29 14:07 eeprom
-r–r--r-- 1 root gpio 4096 Sep 29 14:00 id
-r–r--r-- 1 root gpio 4096 Sep 29 14:00 name
drwxrwxr-x 2 root gpio 0 Sep 29 14:00 power
lrwxrwxrwx 1 root gpio 0 Sep 29 14:00 subsystem → …/…/…/bus/w1
-rw-rw-r-- 1 root gpio 4096 Sep 29 14:00 uevent
debian@beaglebone:~$
tisdag 29 september 2020 kl. 16:36:57 UTC+2 skrev robert.sty...@gmail.com:
Yes, it does still show eeprom
debian@beaglebone:~$ ls /sys/bus/w1/devices/23-000002eddd9b
driver eeprom id name power subsystem uevent
debian@beaglebone:~$ ls /sys/bus/w1/devices/
23-000002eddd9b w1_bus_master1
debian@beaglebone:~$
debian@beaglebone:~$ ls -al /sys/bus/w1/devices/23-000002eddd9b/
total 0
drwxrwxr-x 3 root gpio 0 Sep 29 14:00 .
drwxrwxr-x 4 root gpio 0 Sep 29 14:00 ..
lrwxrwxrwx 1 root gpio 0 Sep 29 14:00 driver -> ../../../bus/w1/drivers/w1_slave_driver
-rw-rw-r-- 1 root gpio 512 Sep 29 14:07 eeprom
Side note, you don't' have to be root, the "gpio" group is the default
for debian..
-r--r--r-- 1 root gpio 4096 Sep 29 14:00 id
-r--r--r-- 1 root gpio 4096 Sep 29 14:00 name
drwxrwxr-x 2 root gpio 0 Sep 29 14:00 power
lrwxrwxrwx 1 root gpio 0 Sep 29 14:00 subsystem -> ../../../bus/w1
-rw-rw-r-- 1 root gpio 4096 Sep 29 14:00 uevent
debian@beaglebone:~$
not sure why you can't write...
Regards,
I suggest trying to write less than 32 bytes (the dmesg implies something wrong with offset or count) – create a file of less than 32 bytes and copy to eeprom
cd ~
echo “1234567890” > file10
cp -T file10 /sys/bus/w1/devices/23-000002eddd9b/eeprom
In the data sheet you need a much smaller R[PU] to write than read
https://datasheets.maximintegrated.com/en/ds/DS2433.pdf
I tried with only a short (6 bytes) string but still the same behaviour.
tisdag 29 september 2020 kl. 17:45:47 UTC+2 skrev robert.sty...@gmail.com:
The eeprom probably is a device, not a filesystem.
Use dd instead.
/Sven
tisdag 29 september 2020 kl. 17:59:14 UTC+2 skrev Johan Lind:
Well, I have an i2c memory on the same board and to read and write to that I can use the following commands:
write
cat data.eeprom > /sys/bus/i2c/devices/2-0057/eeprom
read
cat /sys/bus/i2c/devices/2-0057/eeprom | hexdump
I did try your suggestion of using dd but I could not get it to work.
root@beaglebone:/home/debian# dd if=/dev/zero of=/sys/bus/w1/devices/23-000002eddd9b/eeprom bs=32
dd: error writing ‘/sys/bus/w1/devices/23-000002eddd9b/eeprom’: Invalid argument
1+0 records in
0+0 records out
0 bytes copied, 0.0159578 s, 0.0 kB/s
root@beaglebone:/home/debian#
As the eeprom is written to contain data on another device, so I thought it would be enough to use /dev/zero as input.
Reading out data show no change of content (as expected consider the output from dd)
cat /sys/bus/w1/devices/23-000002eddd9b/eeprom | hexdump
0000000 00ff 55aa 00ff 55aa 00ff 55aa 00ff 55aa
onsdag 30 september 2020 kl. 07:15:53 UTC+2 skrev Sven Norinder:
Maybe kernel must have crc enabled for 2433 writes?
Last line implies something about writes.
config W1_SLAVE_DS2433
tristate “4kb EEPROM family support (DS2433)”
help
Say Y here if you want to use a 1-wire
4kb EEPROM family device (DS2433).
config W1_SLAVE_DS2433_CRC
bool “Protect DS2433 data with a CRC16”
depends on W1_SLAVE_DS2433
select CRC16
help
Say Y here to protect DS2433 data with a CRC16.
Each block has 30 bytes of data and a two byte CRC16.
Full block writes are only allowed if the CRC is valid.
/Sven
onsdag 30 september 2020 kl. 10:56:55 UTC+2 skrev Johan Lind:
I think we’re getting closer to the truth now.
Reading the source code and especially this section is interesting:
#ifdef CONFIG_W1_SLAVE_DS2433_CRC
/* 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;
} }
If I try to run these commands:
echo “12345678901234567890123456789012” > /sys/bus/w1/devices/23-000002eddd9b/eeprom
echo “1234567890123456789012345678901” > /sys/bus/w1/devices/23-000002eddd9b/eeprom
dmesg | tail
[80808.027040] w1_slave_driver 23-000002eddd9b: invalid offset/count off=0 cnt=33
[80829.659168] w1_slave_driver 23-000002eddd9b: bad CRC at offset 0
I removed some output from my terminal and focused on these lines.
The errors found using dmesg looks to come from this section in the driver. If I send 33 bytes I get the invalid offset/count error and with 32 bytes I pass this section and get crc error.
Now I have to try to manually calculating the crc and see where it takes me.
onsdag 30 september 2020 kl. 13:16:09 UTC+2 skrev Sven Norinder:
I have now been able to write to the eeprom.
First I wrote a file with 30 bytes of data, then I calculated the crc16 (pol 8005) and inverted the result bit wise.
int main(void)
{
uint8_t buf[32];
uint16_t crc;
std::ofstream out_file;
crc = 0;
for (int idx = 0; idx < 30; idx++)
{
buf[idx] = idx + 49; // fill buffer with data
crc = crc16_byte_8005(crc, buf[idx]);
}
buf[30] = ~((uint8_t)((crc & 0x00FF)));
buf[31] = ~((uint8_t)((crc & 0xFF00) >> 8));
out_file.open ("/home/debian/test/c_file");
if(out_file.is_open())
{
out_file.write((char *)(&buf), 32);
out_file.close();
}
return 0;
}
The final file I could both write and read to eeprom.
debian@beaglebone:~/test$ cat c_file > /sys/bus/w1/devices/23-000002eddd9b/eeprom
debian@beaglebone:~/test$ cat /sys/bus/w1/devices/23-000002eddd9b/eeprom | hexdump
0000000 3231 3433 3635 3837 3a39 3c3b 3e3d 403f
0000010 4241 4443 4645 4847 4a49 4c4b 4e4d 63ba
0000020 0000 0000 0000 0000 0000 0000 0000 0000