parent
31d3ca0354
commit
e74a1633aa
|
@ -34,7 +34,8 @@
|
|||
|
||||
static struct console_device *first_console;
|
||||
|
||||
static int console_std_set(struct device_d *dev, struct param_d *param, const char *val)
|
||||
static int console_std_set(struct device_d *dev, struct param_d *param,
|
||||
const char *val)
|
||||
{
|
||||
struct console_device *cdev = dev->type_data;
|
||||
unsigned int flag = 0, i = 0;
|
||||
|
@ -60,15 +61,50 @@ static int console_std_set(struct device_d *dev, struct param_d *param, const ch
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int console_baudrate_set(struct device_d *dev, struct param_d *param,
|
||||
const char *val)
|
||||
{
|
||||
struct console_device *cdev = dev->type_data;
|
||||
int baudrate;
|
||||
|
||||
baudrate = simple_strtoul(val, NULL, 10);
|
||||
|
||||
if (cdev->f_active) {
|
||||
printf("## Switch baudrate to %d bps and press ENTER ...\n",
|
||||
baudrate);
|
||||
mdelay(50);
|
||||
cdev->setbrg(cdev, baudrate);
|
||||
mdelay(50);
|
||||
while (getc() != '\r');
|
||||
} else
|
||||
cdev->setbrg(cdev, baudrate);
|
||||
|
||||
sprintf(cdev->baudrate_string, "%d", baudrate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int console_register(struct console_device *newcdev)
|
||||
{
|
||||
struct console_device *cdev = first_console;
|
||||
struct device_d *dev = newcdev->dev;
|
||||
|
||||
if (cdev->setbrg) {
|
||||
newcdev->baudrate_param.set = console_baudrate_set;
|
||||
newcdev->baudrate_param.name = "baudrate";
|
||||
sprintf(newcdev->baudrate_string, "%d",
|
||||
CONFIG_BAUDRATE);
|
||||
console_baudrate_set(dev, &newcdev->baudrate_param,
|
||||
newcdev->baudrate_string);
|
||||
cdev->baudrate_param.value = newcdev->baudrate_string;
|
||||
dev_add_param(dev, &newcdev->baudrate_param);
|
||||
}
|
||||
|
||||
newcdev->active_param.set = console_std_set;
|
||||
newcdev->active_param.name = "active";
|
||||
newcdev->active_param.value = newcdev->active;
|
||||
dev_add_param(dev, &newcdev->active_param);
|
||||
|
||||
#ifdef CONFIG_CONSOLE_ACTIVATE_ALL
|
||||
console_std_set(dev, &newcdev->active_param, "ioe");
|
||||
#endif
|
||||
|
@ -128,8 +164,11 @@ void console_putc(unsigned int ch, char c)
|
|||
struct console_device *cdev = first_console;
|
||||
|
||||
while (cdev) {
|
||||
if (cdev->f_active & ch)
|
||||
if (cdev->f_active & ch) {
|
||||
cdev->putc(cdev, c);
|
||||
if (c == '\n')
|
||||
cdev->putc(cdev, '\r');
|
||||
}
|
||||
cdev = cdev->next;
|
||||
}
|
||||
}
|
||||
|
@ -154,9 +193,8 @@ void console_puts(unsigned int ch, const char *str)
|
|||
const char *s = str;
|
||||
while (*s) {
|
||||
cdev->putc(cdev, *s);
|
||||
if (*s == '\n') {
|
||||
if (*s == '\n')
|
||||
cdev->putc(cdev, '\r');
|
||||
}
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,36 +41,32 @@
|
|||
#include <xfuncs.h>
|
||||
#include <asm/arch/clocks.h>
|
||||
|
||||
static void mpc5xxx_serial_setbrg(struct console_device *cdev)
|
||||
static int mpc5xxx_serial_setbrg(struct console_device *cdev, int baudrate)
|
||||
{
|
||||
struct device_d *dev = cdev->dev;
|
||||
volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
|
||||
unsigned long baseclk;
|
||||
int div;
|
||||
return;
|
||||
printf("%s: ipb\n", __FUNCTION__);
|
||||
|
||||
#if defined(CONFIG_MGT5100)
|
||||
baseclk = (CFG_MPC5XXX_CLKIN + 16) / 32;
|
||||
#elif defined(CONFIG_MPC5200)
|
||||
baseclk = (get_ipb_clock() + 16) / 32;
|
||||
#endif
|
||||
printf("done: %d\n", get_ipb_clock());
|
||||
|
||||
/* set up UART divisor */
|
||||
#if 0
|
||||
div = (baseclk + (gd->baudrate/2)) / gd->baudrate;
|
||||
#else
|
||||
#warning mpc5200 serial: temporary baudrate hack
|
||||
div = (baseclk + (115200 / 2)) / 115200;
|
||||
#endif
|
||||
div = (baseclk + (baudrate/2)) / baudrate;
|
||||
psc->ctur = (div >> 8) & 0xFF;
|
||||
psc->ctlr = div & 0xff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mpc5xxx_serial_init(struct console_device *cdev)
|
||||
{
|
||||
struct device_d *dev = cdev->dev;
|
||||
volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev->map_base;
|
||||
return 0;
|
||||
|
||||
/* reset PSC */
|
||||
psc->command = PSC_SEL_MODE_REG_1;
|
||||
|
||||
|
@ -92,8 +88,6 @@ return 0;
|
|||
#endif
|
||||
psc->mode = PSC_MODE_ONE_STOP;
|
||||
|
||||
mpc5xxx_serial_setbrg(cdev);
|
||||
|
||||
/* disable all interrupts */
|
||||
psc->psc_imr = 0;
|
||||
|
||||
|
@ -148,6 +142,7 @@ static int mpc5xxx_serial_probe(struct device_d *dev)
|
|||
cdev->tstc = mpc5xxx_serial_tstc;
|
||||
cdev->putc = mpc5xxx_serial_putc;
|
||||
cdev->getc = mpc5xxx_serial_getc;
|
||||
cdev->setbrg = mpc5xxx_serial_setbrg;
|
||||
|
||||
mpc5xxx_serial_init(cdev);
|
||||
|
||||
|
|
|
@ -36,11 +36,16 @@ struct console_device {
|
|||
int (*tstc)(struct console_device *cdev);
|
||||
void (*putc)(struct console_device *cdev, char c);
|
||||
int (*getc)(struct console_device *cdev);
|
||||
int (*setbrg)(struct console_device *cdev, int baudrate);
|
||||
|
||||
struct console_device *next;
|
||||
|
||||
unsigned char f_caps;
|
||||
unsigned char f_active;
|
||||
|
||||
struct param_d baudrate_param;
|
||||
char baudrate_string[8];
|
||||
|
||||
struct param_d active_param;
|
||||
char active[4];
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue