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