Esempio n. 1
0
/*
 * 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;
}
Esempio n. 2
0
/*
 * 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;
}
Esempio n. 3
0
/*
 * 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;
}
Esempio n. 4
0
/*
 * 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;
}
Esempio n. 5
0
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;
}