Commit 4408ce6c authored by Cesar Prados's avatar Cesar Prados Committed by Alessandro Rubini

w1: implement eeprom support

This also adds three shell commands, for testing:

     w1w PAGE TEXT
     w1r PAGE
     w1test

The w1test command writes to 80 pages and reads them back (warning: it
erases the whole device).
parent e46b5486
......@@ -11,7 +11,8 @@ obj-y += \
dev/rxts_calibrator.o
obj-$(CONFIG_SOCKITOWM) += dev/onewire.o
obj-$(CONFIG_W1) += dev/w1.o dev/w1-hw.o dev/w1-temp.o
obj-$(CONFIG_W1) += dev/w1.o dev/w1-hw.o
obj-$(CONFIG_W1) += dev/w1-temp.o dev/w1-eeprom.o
obj-$(CONFIG_W1) += dev/mac.o
obj-$(CONFIG_UART) += dev/uart.o
obj-$(CONFIG_UART_SW) += dev/uart-sw.o
/*
* Eeprom support
* Cesar Prados, 2013 GNU GPL2 or later
*/
#include <stdlib.h>
#include <string.h>
#include <wrc.h>
#include <shell.h>
#include <w1.h>
#define LSB_ADDR(X) ((X) & 0xFF)
#define MSB_ADDR(X) (((X) & 0xFF00)>>8)
int w1_write_eeprom(struct w1_dev *dev, int offset, const uint8_t *buffer,
int blen)
{
int i;
int read_data;
w1_match_rom(dev);
w1_write_byte(dev->bus, W1_CMDR_W_SPAD);
w1_write_byte(dev->bus, LSB_ADDR(offset));
w1_write_byte(dev->bus, MSB_ADDR(offset));
for(i = 0; i < 32; i++)
w1_write_byte(dev->bus, buffer[i]);
w1_match_rom(dev);
w1_write_byte(dev->bus, W1_CMDR_C_SPAD);
w1_write_byte(dev->bus, LSB_ADDR(offset));
w1_write_byte(dev->bus, MSB_ADDR(offset));
w1_write_byte(dev->bus, 0x1f);
usleep(10000);
read_data = w1_read_byte(dev->bus);
if (read_data != 0xaa)
return -1;
return 0;
}
int w1_read_eeprom(struct w1_dev *dev, int offset, uint8_t *buffer, int blen)
{
int i;
w1_match_rom(dev);
w1_write_byte(dev->bus, W1_CMDR_R_MEMORY);
w1_write_byte(dev->bus, LSB_ADDR(offset));
w1_write_byte(dev->bus, MSB_ADDR(offset));
for(i = 0; i < 32; i++)
buffer[i] = w1_read_byte(dev->bus);
return 0;
}
/* A shell command, for testing write*/
static int cmd_w1_w(const char *args[])
{
struct w1_dev *d;
int page;
int blen;
char pn[32]="\0";
d = wrpc_w1_bus.devs + 1;
pp_printf("Writing in device: %08x%08x\n",
(int)(d->rom >> 32), (int)d->rom);
page = atoi(args[0]);
blen = strlen(args[1]);
memcpy(pn, args[1], blen);
if(!w1_write_eeprom(d, page*0x20, (uint8_t *)pn, blen))
pp_printf("Write success\n");
return 0;
}
DEFINE_WRC_COMMAND(w1w) = {
.name = "w1w",
.exec = cmd_w1_w,
};
/* A shell command, for testing read*/
static int cmd_w1_r(const char *args[])
{
struct w1_dev *d;
int page;
int i;
char pn[32]="\0";
d = wrpc_w1_bus.devs + 1;
pp_printf("Reading from device: %08x%08x\n",
(int)(d->rom >> 32), (int)d->rom);
page = atoi(args[0]);
w1_read_eeprom(d, page*0x20, (uint8_t *)pn, 32);
for(i=0;i<32;i++)
pp_printf("%c",pn[i]);
pp_printf("\n");
return 0;
}
DEFINE_WRC_COMMAND(w1r) = {
.name = "w1r",
.exec = cmd_w1_r,
};
/* A shell command, for testing write/read*/
static int cmd_w1_test(const char *args[])
{
struct w1_dev *d;
int page;
int errors=0;
int blen;
int i;
char pn[32]="testing";
blen = strlen(pn);
d = wrpc_w1_bus.devs + 1;
pp_printf("Writing in device: %08x%08x\n",
(int)(d->rom >> 32), (int)d->rom);
for(page = 0; page < 80; page++) {
if(!w1_write_eeprom(d, page * 0x20, (uint8_t *)pn, blen)) {
pp_printf("Page %i: success\n", page);
} else {
pp_printf("Page %i: error\n", page);
errors++;
}
}
pp_printf("Write Errors: %d \n", errors);
usleep(1000 * 1000);
for(page = 0; page < 80; page++) {
w1_read_eeprom(d, page * 0x20, (uint8_t *)pn, 32);
for(i = 0; i < 32; i++)
pp_printf("%c",pn[i]);
pp_printf("\n");
}
return 0;
}
DEFINE_WRC_COMMAND(w1test) = {
.name = "w1test",
.exec = cmd_w1_test,
};
......@@ -171,4 +171,3 @@ DEFINE_WRC_COMMAND(w1) = {
.name = "w1",
.exec = cmd_w1,
};
......@@ -55,8 +55,14 @@ extern void w1_match_rom(struct w1_dev *dev);
#define W1_CMDT_CP_SPAD 0x48
#define W1_CMDT_RECALL 0xb8
#define W1_CMDT_R_PS 0xb4
/* EEPROM DS28EC20 */
#define W1_CMDR_W_SPAD 0x0f
#define W1_CMDR_R_SPAD 0xaa
#define W1_CMDR_C_SPAD 0x55
#define W1_CMDR_R_MEMORY 0xf0
#define W1_CMDR_EXT_R_MEMORY 0xa5
/* Temperatture conviersion takes time: by default wait, but allow flags */
/* Temperature conversion takes time: by default wait, but allow flags */
#define W1_FLAG_NOWAIT 0x01 /* start conversion only*/
#define W1_FLAG_COLLECT 0x02 /* don't start, just get output */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment