22 #include <linux/module.h>
23 #include <linux/kernel.h>
26 #include <linux/slab.h>
28 #include "../w1_int.h"
32 #define CONTROL_CMD 0x00
37 #define CTL_RESET_DEVICE 0x0000
38 #define CTL_START_EXE 0x0001
39 #define CTL_RESUME_EXE 0x0002
40 #define CTL_HALT_EXE_IDLE 0x0003
41 #define CTL_HALT_EXE_DONE 0x0004
42 #define CTL_FLUSH_COMM_CMDS 0x0007
43 #define CTL_FLUSH_RCV_BUFFER 0x0008
44 #define CTL_FLUSH_XMT_BUFFER 0x0009
45 #define CTL_GET_COMM_CMDS 0x000A
48 #define MOD_PULSE_EN 0x0000
49 #define MOD_SPEED_CHANGE_EN 0x0001
50 #define MOD_1WIRE_SPEED 0x0002
51 #define MOD_STRONG_PU_DURATION 0x0003
52 #define MOD_PULLDOWN_SLEWRATE 0x0004
53 #define MOD_PROG_PULSE_DURATION 0x0005
54 #define MOD_WRITE1_LOWTIME 0x0006
55 #define MOD_DSOW0_TREC 0x0007
58 #define COMM_ERROR_ESCAPE 0x0601
59 #define COMM_SET_DURATION 0x0012
60 #define COMM_BIT_IO 0x0020
61 #define COMM_PULSE 0x0030
62 #define COMM_1_WIRE_RESET 0x0042
63 #define COMM_BYTE_IO 0x0052
64 #define COMM_MATCH_ACCESS 0x0064
65 #define COMM_BLOCK_IO 0x0074
66 #define COMM_READ_STRAIGHT 0x0080
67 #define COMM_DO_RELEASE 0x6092
68 #define COMM_SET_PATH 0x00A2
69 #define COMM_WRITE_SRAM_PAGE 0x00B2
70 #define COMM_WRITE_EPROM 0x00C4
71 #define COMM_READ_CRC_PROT_PAGE 0x00D4
72 #define COMM_READ_REDIRECT_PAGE_CRC 0x21E4
73 #define COMM_SEARCH_ACCESS 0x00F4
76 #define COMM_TYPE 0x0008
77 #define COMM_SE 0x0008
80 #define COMM_CH 0x0008
81 #define COMM_SM 0x0008
83 #define COMM_IM 0x0001
85 #define COMM_PS 0x4000
86 #define COMM_PST 0x4000
87 #define COMM_CIB 0x4000
88 #define COMM_RTS 0x4000
89 #define COMM_DT 0x2000
90 #define COMM_SPU 0x1000
92 #define COMM_NTF 0x0400
93 #define COMM_ICP 0x0200
94 #define COMM_RST 0x0100
96 #define PULSE_PROG 0x01
97 #define PULSE_SPUE 0x02
99 #define BRANCH_MAIN 0xCC
100 #define BRANCH_AUX 0x33
112 #define RR_DETECT 0xA5
122 #define SPEED_NORMAL 0x00
123 #define SPEED_FLEXIBLE 0x01
124 #define SPEED_OVERDRIVE 0x02
129 #define EP_DATA_OUT 2
175 { USB_DEVICE(0x04fa, 0x2490) },
189 static struct usb_driver ds_driver = {
192 .disconnect = ds_disconnect,
193 .id_table = ds_id_table,
203 printk(
KERN_ERR "Failed to send command control message %x.%x: err=%d.\n",
211 static int ds_send_control_mode(
struct ds_device *dev,
u16 value,
u16 index)
218 printk(
KERN_ERR "Failed to send mode control message %x.%x: err=%d.\n",
226 static int ds_send_control(
struct ds_device *dev,
u16 value,
u16 index)
233 printk(
KERN_ERR "Failed to send control message %x.%x: err=%d.\n",
246 memset(st, 0,
sizeof(*st));
255 if (count >=
sizeof(*st))
256 memcpy(st, buf,
sizeof(*st));
261 static inline void ds_print_msg(
unsigned char *buf,
unsigned char *
str,
int off)
266 static void ds_dump_status(
struct ds_device *dev,
unsigned char *buf,
int count)
276 ds_print_msg(buf,
"enable flag", 0);
277 ds_print_msg(buf,
"1-wire speed", 1);
278 ds_print_msg(buf,
"strong pullup duration", 2);
279 ds_print_msg(buf,
"programming pulse duration", 3);
280 ds_print_msg(buf,
"pulldown slew rate control", 4);
281 ds_print_msg(buf,
"write-1 low time", 5);
282 ds_print_msg(buf,
"data sample offset/write-0 recovery time",
284 ds_print_msg(buf,
"reserved (test register)", 7);
285 ds_print_msg(buf,
"device status flags", 8);
286 ds_print_msg(buf,
"communication command byte 1", 9);
287 ds_print_msg(buf,
"communication command byte 2", 10);
288 ds_print_msg(buf,
"communication command buffer status", 11);
289 ds_print_msg(buf,
"1-wire data output buffer status", 12);
290 ds_print_msg(buf,
"1-wire data input buffer status", 13);
291 ds_print_msg(buf,
"reserved", 14);
292 ds_print_msg(buf,
"reserved", 15);
294 for (i = 16; i <
count; ++
i) {
296 ds_print_msg(buf,
"new device detect", i);
299 ds_print_msg(buf,
"Result Register Value: ", i);
319 static void ds_reset_device(
struct ds_device *dev)
327 "Error allowing strong pullup\n");
334 "Error setting duration\n");
338 static int ds_recv_data(
struct ds_device *dev,
unsigned char *buf,
int size)
354 buf, size, &count, 1000);
362 count = ds_recv_status_nodump(dev, &st, buf,
sizeof(buf));
363 ds_dump_status(dev, buf, count);
371 printk(
"%s: count=%d: ", __func__, count);
380 static int ds_send_data(
struct ds_device *dev,
unsigned char *buf,
int len)
400 int count = 0, err = 0;
410 err = ds_recv_status_nodump(dev, &st, buf,
sizeof(buf));
419 }
while(++count < limit);
444 err = ds_dump_status(dev, st);
457 err = ds_recv_status_nodump(dev, st, buf,
sizeof(buf));
462 for (i=0; i<
err; ++
i)
467 }
while (!(buf[0x08] &
ST_IDLE) && !(err < 0) && ++count < 100);
471 ds_reset_device(dev);
480 if (err > 16 || count >= 100 || err < 0)
481 ds_dump_status(dev, buf, err);
487 if (count >= 100 || err < 0)
493 static int ds_reset(
struct ds_device *dev)
537 u8 del = 1 + (
u8)(delay >> 4);
570 ds_wait_status(dev, &st);
572 err = ds_recv_data(dev, tbit,
sizeof(*tbit));
580 static int ds_write_bit(
struct ds_device *dev,
u8 bit)
594 ds_wait_status(dev, &st);
613 err = ds_wait_status(dev, &st);
617 err = ds_recv_data(dev, &rbyte,
sizeof(rbyte));
621 return !(byte == rbyte);
624 static int ds_read_byte(
struct ds_device *dev,
u8 *byte)
633 ds_wait_status(dev, &st);
635 err = ds_recv_data(dev, byte,
sizeof(*byte));
642 static int ds_read_block(
struct ds_device *dev,
u8 *buf,
int len)
652 err = ds_send_data(dev, buf, len);
660 ds_wait_status(dev, &st);
663 err = ds_recv_data(dev, buf, len);
668 static int ds_write_block(
struct ds_device *dev,
u8 *buf,
int len)
673 err = ds_send_data(dev, buf, len);
684 ds_wait_status(dev, &st);
686 err = ds_recv_data(dev, buf, len);
690 return !(err == len);
695 static int ds_search(
struct ds_device *dev,
u64 init,
u64 *buf,
u8 id_number,
int conditional_search)
701 memset(buf, 0,
sizeof(buf));
703 err = ds_send_data(ds_dev, (
unsigned char *)&init, 8);
707 ds_wait_status(ds_dev, &st);
710 index = (conditional_search ? 0xEC : 0xF0) | (id_number << 8);
711 err = ds_send_control(ds_dev, value, index);
715 ds_wait_status(ds_dev, &st);
717 err = ds_recv_data(ds_dev, (
unsigned char *)buf, 8*id_number);
724 static int ds_match_access(
struct ds_device *dev,
u64 init)
729 err = ds_send_data(dev, (
unsigned char *)&init,
sizeof(init));
733 ds_wait_status(dev, &st);
739 ds_wait_status(dev, &st);
753 err = ds_send_data(dev, buf,
sizeof(buf));
757 ds_wait_status(dev, &st);
763 ds_wait_status(dev, &st);
770 static u8 ds9490r_touch_bit(
void *
data,
u8 bit)
775 if (ds_touch_bit(dev, bit, &ret))
782 static void ds9490r_write_bit(
void *data,
u8 bit)
786 ds_write_bit(dev, bit);
789 static u8 ds9490r_read_bit(
void *data)
795 err = ds_touch_bit(dev, 1, &bit);
803 static void ds9490r_write_byte(
void *data,
u8 byte)
807 ds_write_byte(dev, byte);
810 static u8 ds9490r_read_byte(
void *data)
816 err = ds_read_byte(dev, &byte);
823 static void ds9490r_write_block(
void *data,
const u8 *buf,
int len)
827 ds_write_block(dev, (
u8 *)buf, len);
830 static u8 ds9490r_read_block(
void *data,
u8 *buf,
int len)
835 err = ds_read_block(dev, buf, len);
842 static u8 ds9490r_reset(
void *data)
854 static u8 ds9490r_set_pullup(
void *data,
int delay)
858 if (ds_set_pullup(dev, delay))
864 static int ds_w1_init(
struct ds_device *dev)
878 ds_reset_device(dev);
881 dev->
master.touch_bit = &ds9490r_touch_bit;
891 dev->
master.read_byte = &ds9490r_read_byte;
892 dev->
master.write_byte = &ds9490r_write_byte;
893 dev->
master.read_block = &ds9490r_read_block;
894 dev->
master.write_block = &ds9490r_write_block;
895 dev->
master.reset_bus = &ds9490r_reset;
896 dev->
master.set_pullup = &ds9490r_set_pullup;
901 static void ds_w1_fini(
struct ds_device *dev)
909 struct usb_device *
udev = interface_to_usbdev(intf);
911 struct usb_host_interface *iface_desc;
929 usb_set_intfdata(intf, dev);
933 printk(
KERN_ERR "Failed to set alternative setting 3 for %d interface: err=%d.\n",
934 intf->altsetting[0].desc.bInterfaceNumber, err);
944 iface_desc = &intf->altsetting[0];
945 if (iface_desc->desc.bNumEndpoints !=
NUM_EP-1) {
946 printk(
KERN_INFO "Num endpoints=%d. It is not DS9490R.\n", iface_desc->desc.bNumEndpoints);
955 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++
i) {
956 endpoint = &iface_desc->endpoint[
i].desc;
960 printk(
"%d: addr=%x, size=%d, dir=%s, type=%x\n",
967 err = ds_w1_init(dev);
978 usb_set_intfdata(intf,
NULL);
989 dev = usb_get_intfdata(intf);
999 usb_set_intfdata(intf,
NULL);