"Das U-Boot" Source Tree
at master 385 lines 11 kB view raw
1#ifndef __SERIAL_H__ 2#define __SERIAL_H__ 3 4#include <post.h> 5 6struct serial_device { 7 /* enough bytes to match alignment of following func pointer */ 8 char name[16]; 9 10 int (*start)(void); 11 int (*stop)(void); 12 void (*setbrg)(void); 13 int (*getc)(void); 14 int (*tstc)(void); 15 void (*putc)(const char c); 16 void (*puts)(const char *s); 17#if CFG_POST & CFG_SYS_POST_UART 18 void (*loop)(int); 19#endif 20 struct serial_device *next; 21}; 22 23void default_serial_puts(const char *s); 24 25extern struct serial_device serial_smc_device; 26extern struct serial_device serial_smh_device; 27extern struct serial_device serial_scc_device; 28extern struct serial_device *default_serial_console(void); 29 30#if defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || \ 31 defined(CONFIG_MPC86xx) || \ 32 defined(CONFIG_ARCH_TEGRA) || defined(CONFIG_SYS_COREBOOT) || \ 33 defined(CONFIG_MICROBLAZE) 34extern struct serial_device serial0_device; 35extern struct serial_device serial1_device; 36#endif 37 38extern struct serial_device eserial1_device; 39extern struct serial_device eserial2_device; 40extern struct serial_device eserial3_device; 41extern struct serial_device eserial4_device; 42extern struct serial_device eserial5_device; 43extern struct serial_device eserial6_device; 44 45extern void serial_register(struct serial_device *); 46extern void serial_stdio_init(void); 47extern int serial_assign(const char *name); 48extern void serial_reinit_all(void); 49int serial_initialize(void); 50 51/* For usbtty */ 52#ifdef CONFIG_USB_TTY 53 54struct stdio_dev; 55 56int usbtty_getc(struct stdio_dev *dev); 57void usbtty_putc(struct stdio_dev *dev, const char c); 58void usbtty_puts(struct stdio_dev *dev, const char *str); 59int usbtty_tstc(struct stdio_dev *dev); 60 61#else 62 63/* stubs */ 64#define usbtty_getc(dev) 0 65#define usbtty_putc(dev, a) 66#define usbtty_puts(dev, a) 67#define usbtty_tstc(dev) 0 68 69#endif /* CONFIG_USB_TTY */ 70 71struct udevice; 72 73enum serial_par { 74 SERIAL_PAR_NONE, 75 SERIAL_PAR_ODD, 76 SERIAL_PAR_EVEN 77}; 78 79#define SERIAL_PAR_SHIFT 0 80#define SERIAL_PAR_MASK (0x03 << SERIAL_PAR_SHIFT) 81#define SERIAL_SET_PARITY(parity) \ 82 ((parity << SERIAL_PAR_SHIFT) & SERIAL_PAR_MASK) 83#define SERIAL_GET_PARITY(config) \ 84 ((config & SERIAL_PAR_MASK) >> SERIAL_PAR_SHIFT) 85 86enum serial_bits { 87 SERIAL_5_BITS, 88 SERIAL_6_BITS, 89 SERIAL_7_BITS, 90 SERIAL_8_BITS 91}; 92 93#define SERIAL_BITS_SHIFT 2 94#define SERIAL_BITS_MASK (0x3 << SERIAL_BITS_SHIFT) 95#define SERIAL_SET_BITS(bits) \ 96 ((bits << SERIAL_BITS_SHIFT) & SERIAL_BITS_MASK) 97#define SERIAL_GET_BITS(config) \ 98 ((config & SERIAL_BITS_MASK) >> SERIAL_BITS_SHIFT) 99 100enum serial_stop { 101 SERIAL_HALF_STOP, /* 0.5 stop bit */ 102 SERIAL_ONE_STOP, /* 1 stop bit */ 103 SERIAL_ONE_HALF_STOP, /* 1.5 stop bit */ 104 SERIAL_TWO_STOP /* 2 stop bit */ 105}; 106 107#define SERIAL_STOP_SHIFT 4 108#define SERIAL_STOP_MASK (0x3 << SERIAL_STOP_SHIFT) 109#define SERIAL_SET_STOP(stop) \ 110 ((stop << SERIAL_STOP_SHIFT) & SERIAL_STOP_MASK) 111#define SERIAL_GET_STOP(config) \ 112 ((config & SERIAL_STOP_MASK) >> SERIAL_STOP_SHIFT) 113 114#define SERIAL_CONFIG(par, bits, stop) \ 115 (par << SERIAL_PAR_SHIFT | \ 116 bits << SERIAL_BITS_SHIFT | \ 117 stop << SERIAL_STOP_SHIFT) 118 119#define SERIAL_DEFAULT_CONFIG \ 120 (SERIAL_PAR_NONE << SERIAL_PAR_SHIFT | \ 121 SERIAL_8_BITS << SERIAL_BITS_SHIFT | \ 122 SERIAL_ONE_STOP << SERIAL_STOP_SHIFT) 123 124enum serial_chip_type { 125 SERIAL_CHIP_UNKNOWN = -1, 126 SERIAL_CHIP_16550_COMPATIBLE, 127 SERIAL_CHIP_PL01X, 128}; 129 130enum adr_space_type { 131 SERIAL_ADDRESS_SPACE_MEMORY = 0, 132 SERIAL_ADDRESS_SPACE_IO, 133}; 134 135/** 136 * struct serial_device_info - structure to hold serial device info 137 * 138 * @type: type of the UART chip 139 * @addr_space: address space to access the registers 140 * @addr: physical address of the registers 141 * @size: size of the register area in bytes 142 * @reg_width: size (in bytes) of the IO accesses to the registers 143 * @reg_offset: offset to apply to the @addr from the start of the registers 144 * @reg_shift: quantity to shift the register offsets by 145 * @clock: UART base clock speed in Hz 146 * @baudrate: baud rate 147 */ 148struct serial_device_info { 149 enum serial_chip_type type; 150 enum adr_space_type addr_space; 151 ulong addr; 152 ulong size; 153 u8 reg_width; 154 u8 reg_offset; 155 u8 reg_shift; 156 unsigned int clock; 157 unsigned int baudrate; 158}; 159 160#define SERIAL_DEFAULT_ADDRESS 0xBADACCE5 161#define SERIAL_DEFAULT_CLOCK (16 * 115200) 162 163/** 164 * struct struct dm_serial_ops - Driver model serial operations 165 * 166 * The uclass interface is implemented by all serial devices which use 167 * driver model. 168 */ 169struct dm_serial_ops { 170 /** 171 * setbrg() - Set up the baud rate generator 172 * 173 * Adjust baud rate divisors to set up a new baud rate for this 174 * device. Not all devices will support all rates. If the rate 175 * cannot be supported, the driver is free to select the nearest 176 * available rate. or return -EINVAL if this is not possible. 177 * 178 * @dev: Device pointer 179 * @baudrate: New baud rate to use 180 * @return 0 if OK, -ve on error 181 */ 182 int (*setbrg)(struct udevice *dev, int baudrate); 183 /** 184 * getc() - Read a character and return it 185 * 186 * If no character is available, this should return -EAGAIN without 187 * waiting. 188 * 189 * @dev: Device pointer 190 * @return character (0..255), -ve on error 191 */ 192 int (*getc)(struct udevice *dev); 193 /** 194 * putc() - Write a character 195 * 196 * @dev: Device pointer 197 * @ch: character to write 198 * @return 0 if OK, -ve on error 199 */ 200 int (*putc)(struct udevice *dev, const char ch); 201 /** 202 * puts() - Write a string 203 * 204 * This writes a string. This function should be implemented only if 205 * writing multiple characters at once is more performant than just 206 * calling putc() in a loop. 207 * 208 * If the whole string cannot be written at once, then this function 209 * should return the number of characters written. Returning a negative 210 * error code implies that no characters were written. If this function 211 * returns 0, then it will be called again with the same arguments. 212 * 213 * @dev: Device pointer 214 * @s: The string to write 215 * @len: The length of the string to write. 216 * @return The number of characters written on success, or -ve on error 217 */ 218 ssize_t (*puts)(struct udevice *dev, const char *s, size_t len); 219 /** 220 * pending() - Check if input/output characters are waiting 221 * 222 * This can be used to return an indication of the number of waiting 223 * characters if the driver knows this (e.g. by looking at the FIFO 224 * level). It is acceptable to return 1 if an indeterminant number 225 * of characters is waiting. 226 * 227 * This method is optional. 228 * 229 * @dev: Device pointer 230 * @input: true to check input characters, false for output 231 * @return number of waiting characters, 0 for none, -ve on error 232 */ 233 int (*pending)(struct udevice *dev, bool input); 234 /** 235 * clear() - Clear the serial FIFOs/holding registers 236 * 237 * This method is optional. 238 * 239 * This quickly clears any input/output characters from the UART. 240 * If this is not possible, but characters still exist, then it 241 * is acceptable to return -EAGAIN (try again) or -EINVAL (not 242 * supported). 243 * 244 * @dev: Device pointer 245 * @return 0 if OK, -ve on error 246 */ 247 int (*clear)(struct udevice *dev); 248#if CFG_POST & CFG_SYS_POST_UART 249 /** 250 * loop() - Control serial device loopback mode 251 * 252 * @dev: Device pointer 253 * @on: 1 to turn loopback on, 0 to turn if off 254 */ 255 int (*loop)(struct udevice *dev, int on); 256#endif 257 258 /** 259 * getconfig() - Get the uart configuration 260 * (parity, 5/6/7/8 bits word length, stop bits) 261 * 262 * Get a current config for this device. 263 * 264 * @dev: Device pointer 265 * @serial_config: Returns config information (see SERIAL_... above) 266 * @return 0 if OK, -ve on error 267 */ 268 int (*getconfig)(struct udevice *dev, uint *serial_config); 269 /** 270 * setconfig() - Set up the uart configuration 271 * (parity, 5/6/7/8 bits word length, stop bits) 272 * 273 * Set up a new config for this device. 274 * 275 * @dev: Device pointer 276 * @serial_config: number of bits, parity and number of stopbits to use 277 * @return 0 if OK, -ve on error 278 */ 279 int (*setconfig)(struct udevice *dev, uint serial_config); 280 /** 281 * getinfo() - Get serial device information 282 * 283 * @dev: Device pointer 284 * @info: struct serial_device_info to fill 285 * @return 0 if OK, -ve on error 286 */ 287 int (*getinfo)(struct udevice *dev, struct serial_device_info *info); 288}; 289 290/** 291 * struct serial_dev_priv - information about a device used by the uclass 292 * 293 * @sdev: stdio device attached to this uart 294 * 295 * @buf: Pointer to the RX buffer 296 * @rd_ptr: Read pointer in the RX buffer 297 * @wr_ptr: Write pointer in the RX buffer 298 */ 299struct serial_dev_priv { 300 struct stdio_dev *sdev; 301 302#if CONFIG_IS_ENABLED(SERIAL_RX_BUFFER) 303 char buf[CONFIG_SERIAL_RX_BUFFER_SIZE]; 304 uint rd_ptr; 305 uint wr_ptr; 306#endif 307}; 308 309/* Access the serial operations for a device */ 310#define serial_get_ops(dev) ((struct dm_serial_ops *)(dev)->driver->ops) 311 312/** 313 * serial_getconfig() - Get the uart configuration 314 * (parity, 5/6/7/8 bits word length, stop bits) 315 * 316 * Get a current config for this device. 317 * 318 * @dev: Device pointer 319 * @serial_config: Returns config information (see SERIAL_... above) 320 * Return: 0 if OK, -ve on error 321 */ 322int serial_getconfig(struct udevice *dev, uint *config); 323 324/** 325 * serial_setconfig() - Set up the uart configuration 326 * (parity, 5/6/7/8 bits word length, stop bits) 327 * 328 * Set up a new config for this device. 329 * 330 * @dev: Device pointer 331 * @serial_config: number of bits, parity and number of stopbits to use 332 * Return: 0 if OK, -ve on error 333 */ 334int serial_setconfig(struct udevice *dev, uint config); 335 336/** 337 * serial_getinfo() - Get serial device information 338 * 339 * @dev: Device pointer 340 * @info: struct serial_device_info to fill 341 * Return: 0 if OK, -ve on error 342 */ 343int serial_getinfo(struct udevice *dev, struct serial_device_info *info); 344 345/** 346 * fetch_baud_from_dtb() - Fetch the baudrate value from DT 347 * 348 * Return: baudrate if OK, -ve on error 349 */ 350int fetch_baud_from_dtb(void); 351 352void atmel_serial_initialize(void); 353void mcf_serial_initialize(void); 354void mpc85xx_serial_initialize(void); 355void mxc_serial_initialize(void); 356void ns16550_serial_initialize(void); 357void pl01x_serial_initialize(void); 358void pxa_serial_initialize(void); 359void sh_serial_initialize(void); 360 361/** 362 * serial_printf() - Write a formatted string to the serial console 363 * 364 * The total size of the output must be less than CONFIG_SYS_PBSIZE. 365 * 366 * @fmt: Printf format string, followed by format arguments 367 * Return: number of characters written 368 */ 369int serial_printf(const char *fmt, ...) 370 __attribute__ ((format (__printf__, 1, 2))); 371 372int serial_init(void); 373void serial_setbrg(void); 374void serial_putc(const char ch); 375void serial_putc_raw(const char ch); 376void serial_puts(const char *str); 377#if defined(CONFIG_CONSOLE_FLUSH_SUPPORT) && CONFIG_IS_ENABLED(DM_SERIAL) 378void serial_flush(void); 379#else 380static inline void serial_flush(void) {} 381#endif 382int serial_getc(void); 383int serial_tstc(void); 384 385#endif