⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_driver.c

📁 基于lpc2106和OV6620的源代码
💻 C
字号:
#include "cc3.h"#include "devices.h"#include "serial.h"#include <stdlib.h>#include <errno.h>#undef errnoextern int errno;// we are using sparse file descriptor space,// so don't increase this willy-nillystatic const int max_uarts = 16;static int process_uart_filename(const char *name) {  // parse "COMx:"  if (name[0] == 'C' && name[1] == 'O' && name[2] == 'M') {    char *endptr;    int uart = strtol(name + 3,		      &endptr,		      10);    if (endptr[0] == ':' && endptr[1] == '\0') {      return uart;    }  }  return -1;}static int uart_open (const char *name,		      int flags __attribute__((unused)),		      int mode __attribute__((unused))){  int uart_num = process_uart_filename(name);  if (uart_num >= 0 && uart_num < cc3_uart_get_count()) {    return uart_num + max_uarts; // new uart  } else {    errno = ENODEV;    return -1;  }}static int uart_close (int file __attribute__((unused))){  return 0;}static ssize_t uart_read (int file, void *ptr, size_t len){  cc3_uart_binmode_t binmode;  int (*uart_getc) (void);  unsigned int i;  char c;  char *c_ptr = (char *) ptr;  switch (file) {  case 0:  // non-redirected stdin  case max_uarts + 0:    binmode = _cc3_uart0_binmode;    uart_getc = uart0_getc;    break;  case max_uarts + 1:    binmode = _cc3_uart1_binmode;    uart_getc = uart1_getc;    break;  default:    errno = EBADF;    return -1;  }  for (i = 0; i < len; i++) {    c = uart_getc();    if (binmode == CC3_UART_BINMODE_TEXT && c == '\r') {      c = '\n';    }    *c_ptr++ = c;    if (c == '\n' || c == '\r') {      i++;      break;    }  }  return i;}static ssize_t uart_write (int file, const void *ptr, size_t len){  cc3_uart_binmode_t binmode;  char (*uart_putc) (char);  unsigned int i;  const char *c_ptr = ptr;  switch (file) {  case 1:  // non-redirected stdout  case 2:  // non-redirected stderr  case max_uarts + 0:    binmode = _cc3_uart0_binmode;    uart_putc = uart0_putc;    break;  case max_uarts + 1:    binmode = _cc3_uart1_binmode;    uart_putc = uart1_putc;    break;  default:    errno = EBADF;    return -1;  }  for (i = 0; i < len; i++) {    if (binmode == CC3_UART_BINMODE_TEXT && *c_ptr == '\n') {      uart_putc('\r');    }    uart_putc(*c_ptr++);  }  return i;}static bool uart_recognize (const char *name){  return process_uart_filename(name) != -1;}static off_t uart_lseek (int file __attribute__((unused)),			 off_t offset __attribute__((unused)),			 int dir  __attribute__((unused))){  errno = ESPIPE;  return -1;}static int uart_fstat (int file __attribute__((unused)),		       struct stat *st){  st->st_mode = S_IFCHR;  return 0;}static int uart_unlink (const char *name __attribute__((unused))){  errno = EINVAL;  return -1;}static int uart_rename (const char *oldname __attribute__((unused)),			const char *newname __attribute__((unused))){  errno = EINVAL;  return -1;}_cc3_device_driver_t _cc3_uart_driver = {  .id        = _CC3_DEVICE_UART,  .is_tty    = true,  .open      = uart_open,  .close     = uart_close,  .read      = uart_read,  .write     = uart_write,  .recognize = uart_recognize,  .lseek     = uart_lseek,  .unlink    = uart_unlink,  .rename    = uart_rename,  .fstat     = uart_fstat};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -