1 /*
2  * $Id$
3  *
4  * Bus driver interface
5  * Copyright (C) 2002, 2003 ETC s.r.o.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the ETC s.r.o. nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  *
31  * Written by Marcel Telka <marcel@telka.sk>, 2002, 2003.
32  *
33  */
34 
35 #ifndef URJ_BUS_DRIVER_BRUX_BUS_H
36 #define URJ_BUS_DRIVER_BRUX_BUS_H
37 
38 #include <stdint.h>
39 
40 #include "types.h"
41 #include "params.h"
42 
43 typedef struct
44 {
45     const char *description;
46     uint32_t start;
47     uint64_t length;
48     unsigned int width;
49 }
50 urj_bus_area_t;
51 
52 typedef enum URJ_BUS_PARAM_KEY
53 {
54     URJ_BUS_PARAM_KEY_MUX,      /* bool                         mpc5200 */
55     /* avr32: mode = OCD | HSBC | HSBU | x8 | x16 | x32         avr32 */
56     URJ_BUS_PARAM_KEY_OCD,      /* bool                         avr32 */
57     URJ_BUS_PARAM_KEY_HSBC,     /* bool                         avr32 */
58     URJ_BUS_PARAM_KEY_HSBU,     /* bool                         avr32 */
59     URJ_BUS_PARAM_KEY_X8,       /* bool                         avr32 */
60     URJ_BUS_PARAM_KEY_X16,      /* bool                         avr32 */
61     URJ_BUS_PARAM_KEY_X32,      /* bool                         avr32 */
62     URJ_BUS_PARAM_KEY_WIDTH,    /* 0=auto 8 16 32 64 */
63                                 /* aliased as x8 x16 x32 bool   avr32 */
64                                 /* 8 32 64                      mpc824 */
65                                 /* aliased as AMODE             prototype */
66     URJ_BUS_PARAM_KEY_OPCODE,   /* string                       fjmem */
67     URJ_BUS_PARAM_KEY_LEN,      /* ulong                        fjmem */
68     URJ_BUS_PARAM_KEY_AMODE,    /* alias for WIDTH: 0=auto 8 16 32  prototype */
69     URJ_BUS_PARAM_KEY_ALSB,     /* string (= signal name)       prototype */
70     URJ_BUS_PARAM_KEY_AMSB,     /* string (= signal name)       prototype */
71     URJ_BUS_PARAM_KEY_DLSB,     /* string (= signal name)       prototype */
72     URJ_BUS_PARAM_KEY_DMSB,     /* string (= signal name)       prototype */
73     URJ_BUS_PARAM_KEY_CS,       /* string (= signal name)       prototype */
74     URJ_BUS_PARAM_KEY_NCS,      /* string (= signal name)       prototype */
75     URJ_BUS_PARAM_KEY_OE,       /* string (= signal name)       prototype */
76     URJ_BUS_PARAM_KEY_NOE,      /* string (= signal name)       prototype */
77     URJ_BUS_PARAM_KEY_WE,       /* string (= signal name)       prototype */
78     URJ_BUS_PARAM_KEY_NWE,      /* string (= signal name)       prototype */
79     URJ_BUS_PARAM_KEY_WP,       /* string (= signal name)       prototype */
80     URJ_BUS_PARAM_KEY_NWP,      /* string (= signal name)       prototype */
81     URJ_BUS_PARAM_KEY_REVBITS,  /* bool                         mpc824 */
82     URJ_BUS_PARAM_KEY_HELP,     /* bool                         mpc824 */
83     URJ_BUS_PARAM_KEY_DBGaDDR,  /* bool                         mpc824 */
84     URJ_BUS_PARAM_KEY_DBGdATA,  /* bool                         mpc824 */
85     URJ_BUS_PARAM_KEY_HWAIT,    /* string (= signal name)       blackfin */
86 }
87 urj_bus_param_key_t;
88 
89 typedef enum URJ_BUS_TYPE
90 {
91     URJ_BUS_TYPE_PARALLEL,
92     URJ_BUS_TYPE_SPI,
93     URJ_BUS_TYPE_I2C,
94 }
95 urj_bus_type_t;
96 
97 struct URJ_BUS_DRIVER
98 {
99     const char *name;
100     const char *description;
101     urj_bus_t *(*new_bus) (urj_chain_t *chain,
102                            const urj_bus_driver_t *driver,
103                            const urj_param_t *cmd_params[]);
104     void (*free_bus) (urj_bus_t *bus);
105     void (*printinfo) (urj_log_level_t ll, urj_bus_t *bus);
106     void (*prepare) (urj_bus_t *bus);
107     /** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
108     int (*area) (urj_bus_t *bus, uint32_t adr, urj_bus_area_t *area);
109     /** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
110     int (*read_start) (urj_bus_t *bus, uint32_t adr);
111     /* @@@@ RFHH need to return status */
112     uint32_t (*read_next) (urj_bus_t *bus, uint32_t adr);
113     /* @@@@ RFHH need to return status */
114     uint32_t (*read_end) (urj_bus_t *bus);
115     /* @@@@ RFHH need to return status */
116     uint32_t (*read) (urj_bus_t *bus, uint32_t adr);
117     /* @@@@ RFHH need to return status */
118     int (*write_start) (urj_bus_t *bus, uint32_t adr);
119     void (*write) (urj_bus_t *bus, uint32_t adr, uint32_t data);
120     int (*init) (urj_bus_t *bus);
121     int (*enable) (urj_bus_t *bus);
122     int (*disable) (urj_bus_t *bus);
123     urj_bus_type_t bus_type;
124 };
125 
126 struct URJ_BUS
127 {
128     urj_chain_t *chain;
129     urj_part_t *part;
130     void *params;
131     int initialized;
132     int enabled;
133     const urj_bus_driver_t *driver;
134 };
135 
136 
137 #define URJ_BUS_PRINTINFO(ll,bus)       (bus)->driver->printinfo(ll,bus)
138 #define URJ_BUS_PREPARE(bus)            (bus)->driver->prepare(bus)
139 #define URJ_BUS_AREA(bus,adr,a)         (bus)->driver->area(bus,adr,a)
140 #define URJ_BUS_READ_START(bus,adr)     (bus)->driver->read_start(bus,adr)
141 #define URJ_BUS_READ_NEXT(bus,adr)      (bus)->driver->read_next(bus,adr)
142 #define URJ_BUS_READ_END(bus)           (bus)->driver->read_end(bus)
143 #define URJ_BUS_READ(bus,adr)           (bus)->driver->read(bus,adr)
144 #define URJ_BUS_WRITE_START(bus,adr)    (bus)->driver->write_start(bus,adr)
145 #define URJ_BUS_WRITE(bus,adr,data)     (bus)->driver->write(bus,adr,data)
146 #define URJ_BUS_FREE(bus)               (bus)->driver->free_bus(bus)
147 #define URJ_BUS_INIT(bus)               (bus)->driver->init(bus)
148 #define URJ_BUS_ENABLE(bus)             (bus)->driver->enable(bus)
149 #define URJ_BUS_DISABLE(bus)            (bus)->driver->disable(bus)
150 #define URJ_BUS_TYPE(bus)               (bus)->driver->bus_type
151 
152 /**
153  * API function to init a bus
154  */
155 urj_bus_t *urj_bus_init_bus (urj_chain_t *chain,
156                              const urj_bus_driver_t *bus_driver,
157                              const urj_param_t *param[]);
158 
159 /** The list of recognized parameters */
160 extern const urj_param_list_t urj_bus_param_list;
161 
162 #endif /* URJ_BUS_DRIVER_BRUX_BUS_H */
163