writing data to 1-wire DS2433 eeprom fails

164 views
Skip to first unread message

johan...@orica.com

unread,
Sep 25, 2020, 10:48:17 AM9/25/20
to BeagleBoard
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?

Robert Nelson

unread,
Sep 25, 2020, 10:59:06 AM9/25/20
to Beagle Board
On Fri, Sep 25, 2020 at 9:48 AM johan.lind via BeagleBoard
<beagl...@googlegroups.com> wrote:
>
> 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

https://elinux.org/Beagleboard:BeagleBoneBlack_Debian#Privileged_echo

sudo sh -c "echo 'cat /home/debian/file' > eeprom"

Regards,

--
Robert Nelson
https://rcn-ee.com/

robert.sty...@gmail.com

unread,
Sep 25, 2020, 11:48:24 AM9/25/20
to BeagleBoard
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"

robert.sty...@gmail.com

unread,
Sep 25, 2020, 11:52:55 AM9/25/20
to BeagleBoard
Also the copy command
cp -T source destination
so...
sudo cp -T /home/debian/file eeprom

Johan Lind

unread,
Sep 29, 2020, 10:15:27 AM9/29/20
to BeagleBoard
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

robert.sty...@gmail.com

unread,
Sep 29, 2020, 10:36:57 AM9/29/20
to BeagleBoard
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 ~'

Johan Lind

unread,
Sep 29, 2020, 10:55:33 AM9/29/20
to BeagleBoard
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:~$

Robert Nelson

unread,
Sep 29, 2020, 11:03:48 AM9/29/20
to Beagle Board
On Tue, Sep 29, 2020 at 9:55 AM 'Johan Lind' via BeagleBoard
<beagl...@googlegroups.com> wrote:
>
> 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...

robert.sty...@gmail.com

unread,
Sep 29, 2020, 11:45:47 AM9/29/20
to BeagleBoard
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

Johan Lind

unread,
Sep 29, 2020, 11:59:14 AM9/29/20
to BeagleBoard
I tried with only a short (6 bytes) string but still the same behaviour.

Sven Norinder

unread,
Sep 30, 2020, 1:15:53 AM9/30/20
to BeagleBoard
The eeprom probably is a device, not a filesystem.
Use dd instead.
/Sven

Johan Lind

unread,
Sep 30, 2020, 4:56:55 AM9/30/20
to BeagleBoard
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

Sven Norinder

unread,
Sep 30, 2020, 7:16:09 AM9/30/20
to BeagleBoard
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

Johan Lind

unread,
Sep 30, 2020, 8:40:40 AM9/30/20
to BeagleBoard
I think we're getting closer to the truth now.

Reading the source code and especially this section is interesting:
  /* 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.

Johan Lind

unread,
Sep 30, 2020, 12:45:32 PM9/30/20
to BeagleBoard
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
*
0000200


So to use the eeprom without crc on every page the driver needs to be re-compiled with other options.
Reply all
Reply to author
Forward
0 new messages