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
28 #define HiddI2CAttrBase (SD(cl)->hiddI2CAB)
29 #define HiddI2CDeviceAttrBase (SD(cl)->hiddI2CDeviceAB)
30 #define HiddAttrBase (SD(cl)->hiddAB)
32 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, Read
)
34 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
36 return I2C_WriteRead(dev
->driver
, o
, NULL
, 0, msg
->readBuffer
, msg
->readLength
);
39 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadByte
)
41 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
43 return I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, msg
->data
, 1);
46 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadBytes
)
48 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
50 return I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, msg
->data
, msg
->length
);
53 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadStatus
)
55 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
57 return I2C_WriteRead(dev
->driver
, o
, NULL
, 0, msg
->status
, 1);
60 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, ReadWord
)
62 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
66 if ((r
= I2C_WriteRead(dev
->driver
, o
, &msg
->subaddr
, 1, buff
, 2)))
68 *msg
->data
= (buff
[0] << 8) | buff
[1];
74 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, Write
)
76 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
78 return I2C_WriteRead(dev
->driver
, o
, msg
->writeBuffer
, msg
->writeLength
, NULL
, 0);
81 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteByte
)
83 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
86 buff
[0] = msg
->subaddr
;
89 return I2C_WriteRead(dev
->driver
, o
, buff
, 2, NULL
, 0);
92 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteBytes
)
94 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
96 ULONG nWrite
= msg
->length
;
97 UBYTE
*WriteBuffer
= msg
->data
;
101 if ((r
= I2C_Address(dev
->driver
, o
, dev
->address
& ~1)))
103 if ((r
= I2C_PutByte(dev
->driver
, o
, msg
->subaddr
)))
105 for (; nWrite
> 0; WriteBuffer
++, nWrite
--)
106 if (!(r
= I2C_PutByte(dev
->driver
, o
, *WriteBuffer
)))
110 I2C_Stop(dev
->driver
, o
);
117 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteWord
)
119 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
122 buff
[0] = msg
->subaddr
;
123 buff
[1] = msg
->data
>> 8;
124 buff
[2] = msg
->data
& 0xff;
126 return I2C_WriteRead(dev
->driver
, o
, buff
, 2, NULL
, 0);
129 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteVec
)
131 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
134 ULONG nValues
= msg
->length
;
135 UBYTE
*vec
= msg
->data
;
139 for (; nValues
> 0; nValues
--, vec
+=2)
141 if (!(r
= I2C_Address(dev
->driver
, o
, dev
->address
& ~1)))
146 if (!(r
= I2C_PutByte(dev
->driver
, o
, vec
[0])))
149 if (!(r
= I2C_PutByte(dev
->driver
, o
, vec
[1])))
153 if (s
> 0) I2C_Stop(dev
->driver
, o
);
159 BOOL
METHOD(I2CDev
, Hidd_I2CDevice
, WriteRead
)
161 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
163 return I2C_WriteRead(dev
->driver
, o
, msg
->writeBuffer
, msg
->writeLength
, msg
->readBuffer
, msg
->readLength
);
168 OOP_Object
*METHOD(I2CDev
, Root
, New
)
170 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
) msg
);
173 struct TagItem
*tag
, *tags
= msg
->attrList
;
174 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
175 OOP_Object
*driver
= NULL
;
179 dev
->AcknTimeout
= -1;
180 dev
->BitTimeout
= -1;
181 dev
->ByteTimeout
= -1;
182 dev
->RiseFallTime
= -1;
183 dev
->StartTimeout
= -1;
185 dev
->name
= (STRPTR
)"dev?";
189 while((tag
= NextTagItem(&tags
)))
193 if (IS_I2CDEV_ATTR(tag
->ti_Tag
, idx
))
197 case aoHidd_I2CDevice_Driver
:
198 dev
->driver
= (OOP_Object
*)tag
->ti_Data
;
199 driver
= dev
->driver
;
202 case aoHidd_I2CDevice_Address
:
203 dev
->address
= tag
->ti_Data
;
204 address
= dev
->address
;
207 case aoHidd_I2CDevice_Name
:
208 dev
->name
= (STRPTR
)tag
->ti_Data
;
211 case aoHidd_I2CDevice_HoldTime
:
212 dev
->HoldTime
= tag
->ti_Data
;
215 case aoHidd_I2CDevice_BitTimeout
:
216 dev
->BitTimeout
= tag
->ti_Data
;
219 case aoHidd_I2CDevice_ByteTimeout
:
220 dev
->ByteTimeout
= tag
->ti_Data
;
223 case aoHidd_I2CDevice_AcknTimeout
:
224 dev
->AcknTimeout
= tag
->ti_Data
;
227 case aoHidd_I2CDevice_StartTimeout
:
228 dev
->StartTimeout
= tag
->ti_Data
;
231 case aoHidd_I2CDevice_RiseFallTime
:
232 dev
->RiseFallTime
= tag
->ti_Data
;
238 if (driver
&& address
)
241 if (dev
->AcknTimeout
== -1)
243 OOP_GetAttr(driver
, aHidd_I2C_AcknTimeout
, &val
);
244 dev
->AcknTimeout
= val
;
246 if (dev
->BitTimeout
== -1)
248 OOP_GetAttr(driver
, aHidd_I2C_BitTimeout
, &val
);
249 dev
->BitTimeout
= val
;
251 if (dev
->ByteTimeout
== -1)
253 OOP_GetAttr(driver
, aHidd_I2C_ByteTimeout
, &val
);
254 dev
->ByteTimeout
= val
;
256 if (dev
->HoldTime
== -1)
258 OOP_GetAttr(driver
, aHidd_I2C_HoldTime
, &val
);
261 if (dev
->RiseFallTime
== -1)
263 OOP_GetAttr(driver
, aHidd_I2C_RiseFallTime
, &val
);
264 dev
->RiseFallTime
= val
;
266 if (dev
->StartTimeout
== -1)
268 OOP_GetAttr(driver
, aHidd_I2C_StartTimeout
, &val
);
269 dev
->StartTimeout
= val
;
274 OOP_MethodID disp_mid
= OOP_GetMethodID((STRPTR
)IID_Root
, moRoot_Dispose
);
275 OOP_CoerceMethod(cl
, o
, (OOP_Msg
) &disp_mid
);
283 void METHOD(I2CDev
, Root
, Get
)
285 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
288 if (IS_I2CDEV_ATTR(msg
->attrID
, idx
))
292 case aoHidd_I2CDevice_Driver
:
293 *msg
->storage
= (IPTR
)dev
->driver
;
296 case aoHidd_I2CDevice_Address
:
297 *msg
->storage
= dev
->address
;
300 case aoHidd_I2CDevice_Name
:
301 *msg
->storage
= (IPTR
)dev
->name
;
304 case aoHidd_I2CDevice_HoldTime
:
305 *msg
->storage
= dev
->HoldTime
;
308 case aoHidd_I2CDevice_BitTimeout
:
309 *msg
->storage
= dev
->BitTimeout
;
312 case aoHidd_I2CDevice_ByteTimeout
:
313 *msg
->storage
= dev
->ByteTimeout
;
316 case aoHidd_I2CDevice_AcknTimeout
:
317 *msg
->storage
= dev
->AcknTimeout
;
320 case aoHidd_I2CDevice_StartTimeout
:
321 *msg
->storage
= dev
->StartTimeout
;
324 case aoHidd_I2CDevice_RiseFallTime
:
325 *msg
->storage
= dev
->RiseFallTime
;
331 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
335 void METHOD(I2CDev
, Root
, Set
)
337 tDevData
*dev
= (tDevData
*)OOP_INST_DATA(cl
, o
);
339 struct TagItem
*tag
, *tags
= msg
->attrList
;
341 while ((tag
= NextTagItem(&tags
)))
343 if (IS_I2CDEV_ATTR(tag
->ti_Tag
, idx
))
347 case aoHidd_I2CDevice_HoldTime
:
348 dev
->HoldTime
= tag
->ti_Data
;
351 case aoHidd_I2CDevice_BitTimeout
:
352 dev
->BitTimeout
= tag
->ti_Data
;
355 case aoHidd_I2CDevice_ByteTimeout
:
356 dev
->ByteTimeout
= tag
->ti_Data
;
359 case aoHidd_I2CDevice_AcknTimeout
:
360 dev
->AcknTimeout
= tag
->ti_Data
;
363 case aoHidd_I2CDevice_StartTimeout
:
364 dev
->StartTimeout
= tag
->ti_Data
;
367 case aoHidd_I2CDevice_RiseFallTime
:
368 dev
->RiseFallTime
= tag
->ti_Data
;