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
);
173 const struct TagItem
*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
);
340 const struct TagItem
*tags
= msg
->attrList
;
342 while ((tag
= NextTagItem(&tags
)))
344 if (IS_I2CDEV_ATTR(tag
->ti_Tag
, idx
))
348 case aoHidd_I2CDevice_HoldTime
:
349 dev
->HoldTime
= tag
->ti_Data
;
352 case aoHidd_I2CDevice_BitTimeout
:
353 dev
->BitTimeout
= tag
->ti_Data
;
356 case aoHidd_I2CDevice_ByteTimeout
:
357 dev
->ByteTimeout
= tag
->ti_Data
;
360 case aoHidd_I2CDevice_AcknTimeout
:
361 dev
->AcknTimeout
= tag
->ti_Data
;
364 case aoHidd_I2CDevice_StartTimeout
:
365 dev
->StartTimeout
= tag
->ti_Data
;
368 case aoHidd_I2CDevice_RiseFallTime
:
369 dev
->RiseFallTime
= tag
->ti_Data
;