5 * EtherCAT Slave-Interface. |
5 * EtherCAT Slave-Interface. |
6 * |
6 * |
7 * $Id$ |
7 * $Id$ |
8 * |
8 * |
9 *****************************************************************************/ |
9 *****************************************************************************/ |
|
10 |
|
11 #include <asm/byteorder.h> |
10 |
12 |
11 /*****************************************************************************/ |
13 /*****************************************************************************/ |
12 |
14 |
13 // Bitwise read/write macros |
15 // Bitwise read/write macros |
14 |
16 |
22 |
24 |
23 /*****************************************************************************/ |
25 /*****************************************************************************/ |
24 |
26 |
25 // Read macros |
27 // Read macros |
26 |
28 |
27 #define EC_READ_U8(PD) \ |
29 #define EC_READ_U8(PD) ((uint8_t) *((uint8_t *) (PD))) |
28 (*((uint8_t *) (PD))) |
30 #define EC_READ_S8(PD) ((int8_t) *((uint8_t *) (PD))) |
29 |
31 |
30 #define EC_READ_S8(PD) \ |
32 #define EC_READ_U16(PD) ((uint16_t) le16_to_cpup((void *) (PD))) |
31 ((int8_t) *((uint8_t *) (PD))) |
33 #define EC_READ_S16(PD) ((int16_t) le16_to_cpup((void *) (PD))) |
32 |
34 |
33 #define EC_READ_U16(PD) \ |
35 #define EC_READ_U32(PD) ((uint32_t) le32_to_cpup((void *) (PD))) |
34 ((uint16_t) (*((uint8_t *) (PD) + 0) << 0 | \ |
36 #define EC_READ_S32(PD) ((int32_t) le32_to_cpup((void *) (PD))) |
35 *((uint8_t *) (PD) + 1) << 8)) |
|
36 |
|
37 #define EC_READ_S16(PD) \ |
|
38 ((int16_t) (*((uint8_t *) (PD) + 0) << 0 | \ |
|
39 *((uint8_t *) (PD) + 1) << 8)) |
|
40 |
|
41 #define EC_READ_U32(PD) \ |
|
42 ((uint32_t) (*((uint8_t *) (PD) + 0) << 0 | \ |
|
43 *((uint8_t *) (PD) + 1) << 8 | \ |
|
44 *((uint8_t *) (PD) + 2) << 16 | \ |
|
45 *((uint8_t *) (PD) + 3) << 24)) |
|
46 |
|
47 #define EC_READ_S32(PD) \ |
|
48 ((int32_t) (*((uint8_t *) (PD) + 0) << 0 | \ |
|
49 *((uint8_t *) (PD) + 1) << 8 | \ |
|
50 *((uint8_t *) (PD) + 2) << 16 | \ |
|
51 *((uint8_t *) (PD) + 3) << 24)) |
|
52 |
37 |
53 /*****************************************************************************/ |
38 /*****************************************************************************/ |
54 |
39 |
55 // Write macros |
40 // Write macros |
56 |
41 |
61 |
46 |
62 #define EC_WRITE_S8(PD, VAL) EC_WRITE_U8(PD, VAL) |
47 #define EC_WRITE_S8(PD, VAL) EC_WRITE_U8(PD, VAL) |
63 |
48 |
64 #define EC_WRITE_U16(PD, VAL) \ |
49 #define EC_WRITE_U16(PD, VAL) \ |
65 do { \ |
50 do { \ |
66 *((uint8_t *) (PD) + 0) = ((uint16_t) (VAL) >> 0) & 0xFF; \ |
51 *((uint16_t *) (PD)) = (uint16_t) (VAL); \ |
67 *((uint8_t *) (PD) + 1) = ((uint16_t) (VAL) >> 8) & 0xFF; \ |
52 cpu_to_le16s(PD); \ |
68 } while (0) |
53 } while (0) |
69 |
54 |
70 #define EC_WRITE_S16(PD, VAL) EC_WRITE_U16(PD, VAL) |
55 #define EC_WRITE_S16(PD, VAL) EC_WRITE_U16(PD, VAL) |
71 |
56 |
72 #define EC_WRITE_U32(PD, VAL) \ |
57 #define EC_WRITE_U32(PD, VAL) \ |
73 do { \ |
58 do { \ |
74 *((uint8_t *) (PD) + 0) = ((uint32_t) (VAL) >> 0) & 0xFF; \ |
59 *((uint32_t *) (PD)) = (uint32_t) (VAL); \ |
75 *((uint8_t *) (PD) + 1) = ((uint32_t) (VAL) >> 8) & 0xFF; \ |
60 cpu_to_le16s(PD); \ |
76 *((uint8_t *) (PD) + 2) = ((uint32_t) (VAL) >> 16) & 0xFF; \ |
|
77 *((uint8_t *) (PD) + 3) = ((uint32_t) (VAL) >> 24) & 0xFF; \ |
|
78 } while (0) |
61 } while (0) |
79 |
62 |
80 #define EC_WRITE_S32(PD, VAL) EC_WRITE_U32(PD, VAL) |
63 #define EC_WRITE_S32(PD, VAL) EC_WRITE_U32(PD, VAL) |
81 |
64 |
82 /*****************************************************************************/ |
65 /*****************************************************************************/ |