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

📄 devices.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
字号:
/* * (C) Copyright 2000 * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <config.h>#include <common.h>#include <stdarg.h>#include <malloc.h>#include <devices.h>#include <serial.h>#ifdef CONFIG_LOGBUFFER#include <logbuff.h>#endif#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)#include <i2c.h>#endiflist_t devlist = 0;device_t *stdio_devices[] = { NULL, NULL, NULL };char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" };#if defined(CONFIG_SPLASH_SCREEN) && !defined(CFG_DEVICE_NULLDEV)#define	CFG_DEVICE_NULLDEV	1#endif#ifdef CFG_DEVICE_NULLDEVvoid nulldev_putc(const char c){  /* nulldev is empty! */}void nulldev_puts(const char *s){  /* nulldev is empty! */}int nulldev_input(void){  /* nulldev is empty! */  return 0;}#endif/************************************************************************** * SYSTEM DRIVERS ************************************************************************** */static void drv_system_init (void){	device_t dev;	memset (&dev, 0, sizeof (dev));	strcpy (dev.name, "serial");	dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;#ifdef CONFIG_SERIAL_SOFTWARE_FIFO	dev.putc = serial_buffered_putc;	dev.puts = serial_buffered_puts;	dev.getc = serial_buffered_getc;	dev.tstc = serial_buffered_tstc;#else	dev.putc = serial_putc;	dev.puts = serial_puts;	dev.getc = serial_getc;	dev.tstc = serial_tstc;#endif	device_register (&dev);#ifdef CFG_DEVICE_NULLDEV	memset (&dev, 0, sizeof (dev));	strcpy (dev.name, "nulldev");	dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;	dev.putc = nulldev_putc;	dev.puts = nulldev_puts;	dev.getc = nulldev_input;	dev.tstc = nulldev_input;	device_register (&dev);#endif}/************************************************************************** * DEVICES ************************************************************************** */int device_register (device_t * dev){	ListInsertItem (devlist, dev, LIST_END);	return 0;}/* deregister the device "devname". * returns 0 if success, -1 if device is assigned and 1 if devname not found */#ifdef	CFG_DEVICE_DEREGISTERint device_deregister(char *devname){	int i,l,dev_index;	device_t *dev = NULL;	char temp_names[3][8];	dev_index=-1;	for (i=1; i<=ListNumItems(devlist); i++) {		dev = ListGetPtrToItem (devlist, i);		if(strcmp(dev->name,devname)==0) {			dev_index=i;			break;		}	}	if(dev_index<0) /* device not found */		return 0;	/* get stdio devices (ListRemoveItem changes the dev list) */	for (l=0 ; l< MAX_FILES; l++) {		if (stdio_devices[l] == dev) {			/* Device is assigned -> report error */			return -1;		}		memcpy (&temp_names[l][0],			stdio_devices[l]->name,			sizeof(stdio_devices[l]->name));	}	ListRemoveItem(devlist,NULL,dev_index);	/* reassign Device list */	for (i=1; i<=ListNumItems(devlist); i++) {		dev = ListGetPtrToItem (devlist, i);		for (l=0 ; l< MAX_FILES; l++) {			if(strcmp(dev->name,temp_names[l])==0) {				stdio_devices[l] = dev;			}		}	}	return 0;}#endif	/* CFG_DEVICE_DEREGISTER */int devices_init (void){#ifndef CONFIG_ARM     /* already relocated for current ARM implementation */	DECLARE_GLOBAL_DATA_PTR;	ulong relocation_offset = gd->reloc_off;	int i;	/* relocate device name pointers */	for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) {		stdio_names[i] = (char *) (((ulong) stdio_names[i]) +						relocation_offset);	}#endif	/* Initialize the list */	devlist = ListCreate (sizeof (device_t));	if (devlist == NULL) {		eputs ("Cannot initialize the list of devices!\n");		return -1;	}#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)	i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);#endif#ifdef CONFIG_LCD	drv_lcd_init ();#endif#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)	drv_video_init ();#endif#ifdef CONFIG_KEYBOARD	drv_keyboard_init ();#endif#ifdef CONFIG_LOGBUFFER	drv_logbuff_init ();#endif	drv_system_init ();#ifdef CONFIG_SERIAL_MULTI	serial_devices_init ();#endif#ifdef CONFIG_USB_TTY	drv_usbtty_init ();#endif#ifdef CONFIG_NETCONSOLE	drv_nc_init ();#endif	return (0);}int devices_done (void){	ListDispose (devlist);	return 0;}

⌨️ 快捷键说明

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