2 Copyright © 2004, The AROS Development Team. All rights reserved.
9 #include <exec/types.h>
13 #include <utility/tagitem.h>
15 #include <proto/exec.h>
16 #include <proto/utility.h>
17 #include <proto/oop.h>
22 #include <aros/debug.h>
24 #undef HiddI2CAttrBase
25 #undef HiddI2CDeviceAttrBase
27 #define HiddI2CAttrBase (SD(cl)->hiddI2CAB)
28 #define HiddI2CDeviceAttrBase (SD(cl)->hiddI2CDeviceAB)
29 #define HiddAttrBase (SD(cl)->hiddAB)
31 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, Read
)
33 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
35 return I2C_WriteRead(dev
->driver
, o
, NULL
, 0, msg
->readBuffer
, msg
->readLength
);
38 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadByte
)
40 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
42 return I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, msg
->data
, 1);
45 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadBytes
)
47 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
49 return I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, msg
->data
, msg
->length
);
52 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadStatus
)
54 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
56 return I2C_WriteRead(dev
->driver
, o
, NULL
, 0, msg
->status
, 1);
59 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadWord
)
61 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
65 if ((r
= I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, buff
, 2)))
67 *msg
->data
= (buff
[0] << 8) | buff
[1];
73 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, Write
)
75 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
77 return I2C_WriteRead(dev
->driver
, o
, msg
->writeBuffer
, msg
->writeLength
, NULL
, 0);
80 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteByte
)
82 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
85 buff
[0] = msg
->subaddr
;
88 return I2C_WriteRead(dev
->driver
, o
, buff
, 2, NULL
, 0);
91 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteBytes
)
93 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
95 ULONG nWrite
= msg
->length
;
96 UBYTE
*WriteBuffer
= msg
->data
;
100 if ((r
= I2C_Address(dev
->driver
, o
, dev
->address
& ~1)))
102 if ((r
= I2C_PutByte(dev
->driver
, o
, msg
->subaddr
)))
104 for (; nWrite
> 0; WriteBuffer
++, nWrite
--)
105 if (!(r
= I2C_PutByte(dev
->driver
, o
, *WriteBuffer
)))
109 I2C_Stop(dev
->driver
, o
);
116 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteWord
)
118 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
121 buff
[0] = msg
->subaddr
;
122 buff
[1] = msg
->data
>> 8;
123 buff
[2] = msg
->data
& 0xff;
125 return I2C_WriteRead(dev
->driver
, o
, buff
, 2, NULL
, 0);
128 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteVec
)
130 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
133 ULONG nValues
= msg
->length
;
134 UBYTE
*vec
= msg
->data
;
138 for (; nValues
> 0; nValues
--, vec
+=2)
140 if (!(r
= I2C_Address(dev
->driver
, o
, dev
->address
& ~1)))
145 if (!(r
= I2C_PutByte(dev
->driver
, o
, vec
[0])))
148 if (!(r
= I2C_PutByte(dev
->driver
, o
, vec
[1])))
152 if (s
> 0) I2C_Stop(dev
->driver
, o
);
158 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteRead
)
160 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
162 return I2C_WriteRead(dev
->driver
, o
, msg
->writeBuffer
, msg
->writeLength
, msg
->readBuffer
, msg
->readLength
);
167 OOP_Object
*METHOD(I2CDev
, Root
, New
)
169 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
) msg
);
172 struct TagItem
*tag
, *tags
= msg
->attrList
;
173 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
174 OOP_Object
*driver
= NULL
;
178 dev
->AcknTimeout
= -1;
179 dev
->BitTimeout
= -1;
180 dev
->ByteTimeout
= -1;
181 dev
->RiseFallTime
= -1;
182 dev
->StartTimeout
= -1;
184 dev
->name
= (STRPTR
)"dev?";
188 while((tag
= NextTagItem(&tags
)))
192 if (IS_I2CDEV_ATTR(tag
->ti_Tag
, idx
))
196 case aoHidd_I2CDevice_Driver
:
197 dev
->driver
= (OOP_Object
*)tag
->ti_Data
;
198 driver
= dev
->driver
;
201 case aoHidd_I2CDevice_Address
:
202 dev
->address
= tag
->ti_Data
;
203 address
= dev
->address
;
206 case aoHidd_I2CDevice_Name
:
207 dev
->name
= (STRPTR
)tag
->ti_Data
;
210 case aoHidd_I2CDevice_HoldTime
:
211 dev
->HoldTime
= tag
->ti_Data
;
214 case aoHidd_I2CDevice_BitTimeout
:
215 dev
->BitTimeout
= tag
->ti_Data
;
218 case aoHidd_I2CDevice_ByteTimeout
:
219 dev
->ByteTimeout
= tag
->ti_Data
;
222 case aoHidd_I2CDevice_AcknTimeout
:
223 dev
->AcknTimeout
= tag
->ti_Data
;
226 case aoHidd_I2CDevice_StartTimeout
:
227 dev
->StartTimeout
= tag
->ti_Data
;
230 case aoHidd_I2CDevice_RiseFallTime
:
231 dev
->RiseFallTime
= tag
->ti_Data
;
237 if (driver
&& address
)
240 if (dev
->AcknTimeout
== -1)
242 OOP_GetAttr(driver
, aHidd_I2C_AcknTimeout
, &val
);
243 dev
->AcknTimeout
= val
;
245 if (dev
->BitTimeout
== -1)
247 OOP_GetAttr(driver
, aHidd_I2C_BitTimeout
, &val
);
248 dev
->BitTimeout
= val
;
250 if (dev
->ByteTimeout
== -1)
252 OOP_GetAttr(driver
, aHidd_I2C_ByteTimeout
, &val
);
253 dev
->ByteTimeout
= val
;
255 if (dev
->HoldTime
== -1)
257 OOP_GetAttr(driver
, aHidd_I2C_HoldTime
, &val
);
260 if (dev
->RiseFallTime
== -1)
262 OOP_GetAttr(driver
, aHidd_I2C_RiseFallTime
, &val
);
263 dev
->RiseFallTime
= val
;
265 if (dev
->StartTimeout
== -1)
267 OOP_GetAttr(driver
, aHidd_I2C_StartTimeout
, &val
);
268 dev
->StartTimeout
= val
;
273 OOP_MethodID disp_mid
= OOP_GetMethodID((STRPTR
)IID_Root
, moRoot_Dispose
);
274 OOP_CoerceMethod(cl
, o
, (OOP_Msg
) &disp_mid
);
282 void METHOD(I2CDev
, Root
, Get
)
284 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
287 if (IS_I2CDEV_ATTR(msg
->attrID
, idx
))
291 case aoHidd_I2CDevice_Driver
:
292 *msg
->storage
= (IPTR
)dev
->driver
;
295 case aoHidd_I2CDevice_Address
:
296 *msg
->storage
= dev
->address
;
299 case aoHidd_I2CDevice_Name
:
300 *msg
->storage
= (IPTR
)dev
->name
;
303 case aoHidd_I2CDevice_HoldTime
:
304 *msg
->storage
= dev
->HoldTime
;
307 case aoHidd_I2CDevice_BitTimeout
:
308 *msg
->storage
= dev
->BitTimeout
;
311 case aoHidd_I2CDevice_ByteTimeout
:
312 *msg
->storage
= dev
->ByteTimeout
;
315 case aoHidd_I2CDevice_AcknTimeout
:
316 *msg
->storage
= dev
->AcknTimeout
;
319 case aoHidd_I2CDevice_StartTimeout
:
320 *msg
->storage
= dev
->StartTimeout
;
323 case aoHidd_I2CDevice_RiseFallTime
:
324 *msg
->storage
= dev
->RiseFallTime
;
330 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
334 void METHOD(I2CDev
, Root
, Set
)
336 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
338 struct TagItem
*tag
, *tags
= msg
->attrList
;
340 while ((tag
= NextTagItem(&tags
)))
342 if (IS_I2CDEV_ATTR(tag
->ti_Tag
, idx
))
346 case aoHidd_I2CDevice_HoldTime
:
347 dev
->HoldTime
= tag
->ti_Data
;
350 case aoHidd_I2CDevice_BitTimeout
:
351 dev
->BitTimeout
= tag
->ti_Data
;
354 case aoHidd_I2CDevice_ByteTimeout
:
355 dev
->ByteTimeout
= tag
->ti_Data
;
358 case aoHidd_I2CDevice_AcknTimeout
:
359 dev
->AcknTimeout
= tag
->ti_Data
;
362 case aoHidd_I2CDevice_StartTimeout
:
363 dev
->StartTimeout
= tag
->ti_Data
;
366 case aoHidd_I2CDevice_RiseFallTime
:
367 dev
->RiseFallTime
= tag
->ti_Data
;