/* * unregister framebuffer driver */ bool_t unregister_framebuffer(struct fb * fb) { struct chrdev * dev; struct console * console; struct fb_console_info * info; struct fb * driver; u8_t brightness; if(!fb || !fb->info || !fb->info->name) return FALSE; dev = search_chrdev_with_type(fb->info->name, CHR_DEV_FRAMEBUFFER); if(!dev) return FALSE; console = search_console((char *)fb->info->name); if(console) info = (struct fb_console_info *)console->priv; else return FALSE; driver = (struct fb *)(dev->driver); if(driver) { if(driver->ioctl) { brightness = 0x00; (driver->ioctl)(driver, IOCTL_SET_FB_BACKLIGHT, &brightness); } if(driver->exit) (driver->exit)(driver); } if(!unregister_console(console)) return FALSE; if(!unregister_chrdev(dev->name)) return FALSE; free(info->cell); free(info); free(console); free(dev); return TRUE; }
/* * unregister rtc driver */ bool_t unregister_rtc(struct rtc_driver * drv) { struct chrdev * dev; struct rtc_driver * driver; if(!drv || !drv->name) return FALSE; dev = search_chrdev_with_type(drv->name, CHR_DEV_RTC); if(!dev) return FALSE; driver = (struct rtc_driver *)(dev->driver); if(driver && driver->exit) (driver->exit)(); if(!unregister_chrdev(dev->name)); return FALSE; free(dev); return TRUE; }
/* * register rtc driver, return true is successed. */ bool_t register_rtc(struct rtc_driver * drv) { struct chrdev * dev; if(!drv || !drv->name || !drv->get_time) return FALSE; dev = malloc(sizeof(struct chrdev)); if(!dev) return FALSE; dev->name = drv->name; dev->type = CHR_DEV_RTC; dev->open = rtc_open; dev->read = rtc_read; dev->write = rtc_write; dev->ioctl = rtc_ioctl; dev->close = rtc_close; dev->driver = drv; if(!register_chrdev(dev)) { free(dev); return FALSE; } if(search_chrdev_with_type(dev->name, CHR_DEV_RTC) == NULL) { unregister_chrdev(dev->name); free(dev); return FALSE; } if(drv->init) (drv->init)(); return TRUE; }
/* * register framebuffer driver. */ bool_t register_framebuffer(struct fb * fb) { struct chrdev * dev; struct console * console; struct fb_console_info * info; struct color_t col; u8_t brightness; if(!fb || !fb->info || !fb->info->name) return FALSE; surface_set_maps(&fb->info->surface.maps); dev = malloc(sizeof(struct chrdev)); if(!dev) return FALSE; dev->name = fb->info->name; dev->type = CHR_DEV_FRAMEBUFFER; dev->open = fb_open; dev->read = fb_read; dev->write = fb_write; dev->ioctl = fb_ioctl; dev->close = fb_close; dev->driver = fb; if(!register_chrdev(dev)) { free(dev); return FALSE; } if(search_chrdev_with_type(dev->name, CHR_DEV_FRAMEBUFFER) == NULL) { unregister_chrdev(dev->name); free(dev); return FALSE; } if(fb->init) (fb->init)(fb); display_logo(fb); if(fb->ioctl) { brightness = 0xff; (fb->ioctl)(fb, IOCTL_SET_FB_BACKLIGHT, &brightness); } if(default_framebuffer == NULL) default_framebuffer = fb; /* * register a console */ console = malloc(sizeof(struct console)); info = malloc(sizeof(struct fb_console_info)); if(!console || !info) { unregister_chrdev(dev->name); free(dev); free(console); free(info); return FALSE; } info->name = (char *)fb->info->name; info->fb = fb; info->fw = 8; info->fh = 16; info->w = fb->info->surface.w / info->fw; info->h = fb->info->surface.h / info->fh; info->x = 0; info->y = 0; info->f = TCOLOR_WHITE; info->b = TCOLOR_BLACK; tcolor_to_color(info->f, &col); info->fc = fb_map_color(fb, &col); tcolor_to_color(info->b, &col); info->bc = fb_map_color(fb, &col); info->cursor = TRUE; info->onoff = TRUE; info->clen = info->w * info->h; info->cell = malloc(info->clen * sizeof(struct fbcon_cell)); if(!info->cell) { unregister_chrdev(dev->name); free(dev); free(console); free(info); return FALSE; } memset(info->cell, 0, info->clen * sizeof(struct fbcon_cell)); console->name = info->name; console->getwh = fbcon_getwh; console->getxy = fbcon_getxy; console->gotoxy = fbcon_gotoxy; console->setcursor = fbcon_setcursor; console->getcursor = fbcon_getcursor; console->setcolor = fbcon_setcolor; console->getcolor = fbcon_getcolor; console->cls = fbcon_cls; console->getcode = NULL; console->putcode = fbcon_putcode; console->onoff = fbcon_onoff; console->priv = info; if(!register_console(console)) { unregister_chrdev(dev->name); free(dev); free(console); free(info->cell); free(info); return FALSE; } return TRUE; }
static int serial(int argc, char ** argv) { struct chrdev * device = NULL; ssize_t (* read_func)(struct chrdev *, u8_t *, size_t); struct serial_parameter param; char * name = NULL, * str = NULL; char * baud = 0; char * data_bit = 0; char * parity = 0; char * stop_bit = 0; u8_t c; s32_t i; if(argc < 2) { serial_info(); return 0; } if( !strcmp((const char *)argv[1],"info") ) { serial_info(); } else if( !strcmp((const char *)argv[1],"send") ) { if(argc != 4) { printk("usage:\r\n serial [info]\r\n" " serial send <DEVICE NAME> <STRING>\r\n" " serial recv <DEVICE NAME>\r\n" " serial param <DEVICE NAME> [-b BAUD] [-d DATABITS] [-p PARITY] [-s STOPBITS]\r\n"); return (-1); } name = (char *)argv[2]; str = (char *)argv[3]; device = search_chrdev_with_type((const char *)name, CHR_DEV_SERIAL); if(!device) { printk(" not found serial device \"%s\"\r\n", name); printk(" try 'serial info' for list all of serial devices\r\n"); return -1; } if(device->open) (device->open)(device); if(device->write) (device->write)(device, (u8_t *)str, strlen(str)); if(device->close) (device->close)(device); } else if( !strcmp((const char *)argv[1],"recv") ) { if(argc != 3) { printk("usage:\r\n serial [info]\r\n" " serial send <DEVICE NAME> <STRING>\r\n" " serial recv <DEVICE NAME>\r\n" " serial param <DEVICE NAME> [-b BAUD] [-d DATABITS] [-p PARITY] [-s STOPBITS]\r\n"); return (-1); } name = (char *)argv[2]; device = search_chrdev_with_type((const char *)name, CHR_DEV_SERIAL); if(!device) { printk(" not found serial device \"%s\"\r\n", name); printk(" try 'serial info' for list all of serial devices\r\n"); return -1; } if(device->open) (device->open)(device); if(device->read) { read_func = device->read; while(1) { if(read_func(device, &c, 1) == 1) { if(isprint(c) || isspace(c)) printk("%c", c); else printk("<%02x>", c); } if(ctrlc()) break; } } if(device->close) (device->close)(device); } else if( !strcmp((const char *)argv[1],"param") ) { if(argc < 3) { printk("usage:\r\n serial [info]\r\n" " serial send <DEVICE NAME> <STRING>\r\n" " serial recv <DEVICE NAME>\r\n" " serial param <DEVICE NAME> [-b BAUD] [-d DATABITS] [-p PARITY] [-s STOPBITS]\r\n"); return (-1); } for(i=2; i<argc; i++) { if( !strcmp((const char *)argv[i],"-b") && (argc > i+1)) { baud = (char *)argv[i+1]; i++; } else if( !strcmp((const char *)argv[i],"-d") && (argc > i+1)) { data_bit = (char *)argv[i+1]; i++; } else if( !strcmp((const char *)argv[i],"-p") && (argc > i+1)) { parity = (char *)argv[i+1]; i++; } else if( !strcmp((const char *)argv[i],"-s") && (argc > i+1)) { stop_bit = (char *)argv[i+1]; i++; } else if(*argv[i] != '-' && strcmp((const char *)argv[i], "-") != 0) { name = (char *)argv[i]; device = search_chrdev_with_type((const char *)name, CHR_DEV_SERIAL); if(!device) { printk(" not found serial device \"%s\"\r\n", name); printk(" try 'serial info' for list all of serial devices\r\n"); return -1; } if(!(device->ioctl)) { printk(" don't support ioctl function at this device.\r\n"); return -1; } } } if(!name) { printk("usage:\r\n serial [info]\r\n" " serial send <DEVICE NAME> <STRING>\r\n" " serial recv <DEVICE NAME>\r\n" " serial param <DEVICE NAME> [-b BAUD] [-d DATABITS] [-p PARITY] [-s STOPBITS]\r\n"); return (-1); } if(baud) { if(!strcmp(baud, "50")) param.baud_rate = B50; else if(!strcmp(baud, "75")) param.baud_rate = B75; else if(!strcmp(baud, "110")) param.baud_rate = B110; else if(!strcmp(baud, "134")) param.baud_rate = B134; else if(!strcmp(baud, "200")) param.baud_rate = B200; else if(!strcmp(baud, "300")) param.baud_rate = B300; else if(!strcmp(baud, "600")) param.baud_rate = B600; else if(!strcmp(baud, "1200")) param.baud_rate = B1200; else if(!strcmp(baud, "1800")) param.baud_rate = B1800; else if(!strcmp(baud, "2400")) param.baud_rate = B2400; else if(!strcmp(baud, "4800")) param.baud_rate = B4800; else if(!strcmp(baud, "9600")) param.baud_rate = B9600; else if(!strcmp(baud, "19200")) param.baud_rate = B19200; else if(!strcmp(baud, "38400")) param.baud_rate = B38400; else if(!strcmp(baud, "57600")) param.baud_rate = B57600; else if(!strcmp(baud, "76800")) param.baud_rate = B76800; else if(!strcmp(baud, "115200")) param.baud_rate = B115200; else if(!strcmp(baud, "230400")) param.baud_rate = B230400; else if(!strcmp(baud, "380400")) param.baud_rate = B380400; else if(!strcmp(baud, "460800")) param.baud_rate = B460800; else if(!strcmp(baud, "921600")) param.baud_rate = B921600; else { printk("unrecognize the parameter of baud rate \"%s\"\r\n", baud); return -1; } if(device->ioctl(device, IOCTL_WR_SERIAL_BAUD_RATE, (void *)(&(param.baud_rate))) < 0) { printk("setting serial device's baud rate fail. (%s)\r\n", device->name); return -1; } } if(data_bit) { if(!strcmp(data_bit, "5")) param.data_bit = DATA_BITS_5; else if(!strcmp(data_bit, "6")) param.data_bit = DATA_BITS_6; else if(!strcmp(data_bit, "7")) param.data_bit = DATA_BITS_7; else if(!strcmp(data_bit, "8")) param.data_bit = DATA_BITS_8; else { printk("unrecognize the parameter of data bits \"%s\"\r\n", data_bit); return -1; } if(device->ioctl(device, IOCTL_WR_SERIAL_DATA_BITS, (void *)(&(param.data_bit))) < 0) { printk("setting serial device's data bits fail. (%s)\r\n", device->name); return -1; } } if(parity) { if(!strcmp(parity, "N")) param.parity = PARITY_NONE; else if(!strcmp(parity, "E")) param.parity = PARITY_EVEN; else if(!strcmp(parity, "O")) param.parity = PARITY_ODD; else { printk("unrecognize the parameter of parity \"%s\"\r\n", parity); return -1; } if(device->ioctl(device, IOCTL_WR_SERIAL_PARITY_BIT, (void *)(&(param.parity))) < 0) { printk("setting serial device's parity fail. (%s)\r\n", device->name); return -1; } } if(stop_bit) { if(!strcmp(stop_bit, "1")) param.stop_bit = STOP_BITS_1; else if(!strcmp(stop_bit, "1.5")) param.stop_bit = STOP_BITS_1_5; else if(!strcmp(stop_bit, "2")) param.stop_bit = STOP_BITS_2; else { printk("unrecognize the parameter of stop bits \"%s\"\r\n", stop_bit); return -1; } if(device->ioctl(device, IOCTL_WR_SERIAL_STOP_BITS, (void *)(&(param.stop_bit))) < 0) { printk("setting serial device's stop bit fail. (%s)\r\n", device->name); return -1; } } printk("setting serial device's parameter successed. (%s)\r\n", device->name); return 0; } else { printk("serial: invalid option '%s'\r\n", argv[1]); printk("usage:\r\n serial [info]\r\n" " serial send <DEVICE NAME> <STRING>\r\n" " serial recv <DEVICE NAME>\r\n" " serial param <DEVICE NAME> [-b BAUD] [-d DATABITS] [-p PARITY] [-s STOPBITS]\r\n"); printk("try 'help serial' for more information.\r\n"); return (-1); } return 0; }