110 lines
2.5 KiB
C
110 lines
2.5 KiB
C
/*
|
|
* UART driver for PIC32.
|
|
*
|
|
* Copyright (c) 1986 Regents of the University of California.
|
|
* All rights reserved. The Berkeley software License Agreement
|
|
* specifies the terms and conditions for redistribution.
|
|
*/
|
|
#include <sys/param.h>
|
|
#include <sys/conf.h>
|
|
#include <sys/user.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/tty.h>
|
|
#include <sys/systm.h>
|
|
|
|
#include <sys/uart.h>
|
|
#include <sys/usb_uart.h>
|
|
|
|
#define CONCAT(x,y) x ## y
|
|
#define BBAUD(x) CONCAT(B,x)
|
|
|
|
#ifndef CONSOLE_BAUD
|
|
#define CONSOLE_BAUD 115200
|
|
#endif
|
|
|
|
const struct devspec cndevs[] = {
|
|
{ 0, "console" },
|
|
{ 0, 0 }
|
|
};
|
|
|
|
dev_t console_device = -1;
|
|
|
|
#define NKL 1 /* Only one console device */
|
|
|
|
#define Q2(X) #X
|
|
#define QUOTE(X) Q2(X)
|
|
|
|
struct tty cnttys [1];
|
|
|
|
void cnstart (struct tty *tp);
|
|
|
|
void cninit()
|
|
{
|
|
console_device = get_cdev_by_name(QUOTE(CONSOLE_DEVICE));
|
|
}
|
|
|
|
void cnidentify()
|
|
{
|
|
printf ("console: %s (%d,%d)\n", cdevname(console_device),
|
|
major(console_device), minor(console_device));
|
|
}
|
|
|
|
int cnopen(dev_t dev, int flag, int mode)
|
|
{
|
|
return cdevsw[major(console_device)].d_open(console_device, flag, mode);
|
|
}
|
|
|
|
int cnclose (dev_t dev, int flag, int mode)
|
|
{
|
|
return cdevsw[major(console_device)].d_close(console_device, flag, mode);
|
|
}
|
|
|
|
int cnread(dev_t dev,register struct uio *uio, int flag)
|
|
{
|
|
return cdevsw[major(console_device)].d_read(console_device, uio, flag);
|
|
}
|
|
|
|
int cnwrite(dev_t dev,register struct uio *uio, int flag)
|
|
{
|
|
return cdevsw[major(console_device)].d_write(console_device, uio, flag);
|
|
}
|
|
|
|
int cnselect(dev_t dev, int rw)
|
|
{
|
|
return cdevsw[major(console_device)].d_select(console_device, rw);
|
|
}
|
|
|
|
int cnioctl(dev_t dev, register u_int cmd, caddr_t addr, int flag)
|
|
{
|
|
return cdevsw[major(console_device)].d_ioctl(console_device, cmd, addr, flag);
|
|
}
|
|
|
|
/*
|
|
* Put a symbol on console terminal.
|
|
*/
|
|
void cnputc(char c)
|
|
{
|
|
if (cdevsw[major(console_device)].r_write) {
|
|
cdevsw[major(console_device)].r_write(console_device, c);
|
|
} else {
|
|
putc(c, &cdevsw[major(console_device)].d_ttys[minor(console_device)].t_outq);
|
|
ttstart(&cdevsw[major(console_device)].d_ttys[minor(console_device)]);
|
|
ttyflush(&cdevsw[major(console_device)].d_ttys[minor(console_device)],0);
|
|
}
|
|
if(c=='\n')
|
|
cnputc('\r');
|
|
}
|
|
|
|
/*
|
|
* Receive a symbol from console terminal.
|
|
*/
|
|
int
|
|
cngetc ()
|
|
{
|
|
if (cdevsw[major(console_device)].r_read) {
|
|
return cdevsw[major(console_device)].r_read(console_device);
|
|
} else {
|
|
return getc(&cdevsw[major(console_device)].d_ttys[minor(console_device)].t_rawq);
|
|
}
|
|
}
|