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

📄 mwavedd.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
				remove_wait_queue(&pDrvData->IPCs[ipcnum].ipc_wait_queue, &wait);				set_current_state(TASK_RUNNING);				PRINTK_2(TRACE_MWAVE,					"mwavedd::mwave_ioctl IOCTL_MW_GET_IPC,"					" returning thread for ipc %x"					" processing\n",					ipcnum);			}		}			break;			case IOCTL_MW_UNREGISTER_IPC: {			unsigned int ipcnum = (unsigned int) ioarg;				PRINTK_2(TRACE_MWAVE,				"mwavedd::mwave_ioctl IOCTL_MW_UNREGISTER_IPC"				" ipcnum %x\n",				ipcnum);			if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {				PRINTK_ERROR(KERN_ERR_MWAVE						"mwavedd::mwave_ioctl:"						" IOCTL_MW_UNREGISTER_IPC:"						" Error: Invalid ipcnum %x\n",						ipcnum);				return -EINVAL;			}			if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) {				pDrvData->IPCs[ipcnum].bIsEnabled = FALSE;				if (pDrvData->IPCs[ipcnum].bIsHere == TRUE) {					wake_up_interruptible(&pDrvData->IPCs[ipcnum].ipc_wait_queue);				}			}		}			break;			default:			PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl:"					" Error: Unrecognized iocmd %x\n",					iocmd);			return -ENOTTY;			break;	} /* switch */	PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_ioctl, exit retval %x\n", retval);	return retval;}static ssize_t mwave_read(struct file *file, char __user *buf, size_t count,                          loff_t * ppos){	PRINTK_5(TRACE_MWAVE,		"mwavedd::mwave_read entry file %p, buf %p, count %zx ppos %p\n",		file, buf, count, ppos);	return -EINVAL;}static ssize_t mwave_write(struct file *file, const char __user *buf,                           size_t count, loff_t * ppos){	PRINTK_5(TRACE_MWAVE,		"mwavedd::mwave_write entry file %p, buf %p,"		" count %zx ppos %p\n",		file, buf, count, ppos);	return -EINVAL;}static int register_serial_portandirq(unsigned int port, int irq){	struct uart_port uart;		switch ( port ) {		case 0x3f8:		case 0x2f8:		case 0x3e8:		case 0x2e8:			/* OK */			break;		default:			PRINTK_ERROR(KERN_ERR_MWAVE					"mwavedd::register_serial_portandirq:"					" Error: Illegal port %x\n", port );			return -1;	} /* switch */	/* port is okay */	switch ( irq ) {		case 3:		case 4:		case 5:		case 7:			/* OK */			break;		default:			PRINTK_ERROR(KERN_ERR_MWAVE					"mwavedd::register_serial_portandirq:"					" Error: Illegal irq %x\n", irq );			return -1;	} /* switch */	/* irq is okay */	memset(&uart, 0, sizeof(struct uart_port));		uart.uartclk =  1843200;	uart.iobase = port;	uart.irq = irq;	uart.iotype = UPIO_PORT;	uart.flags =  UPF_SHARE_IRQ;	return serial8250_register_port(&uart);}static struct file_operations mwave_fops = {	.owner		= THIS_MODULE,	.read		= mwave_read,	.write		= mwave_write,	.ioctl		= mwave_ioctl,	.open		= mwave_open,	.release	= mwave_close};static struct miscdevice mwave_misc_dev = { MWAVE_MINOR, "mwave", &mwave_fops };#if 0 /* totally b0rked *//* * sysfs support <paulsch@us.ibm.com> */struct device mwave_device;/* Prevent code redundancy, create a macro for mwave_show_* functions. */#define mwave_show_function(attr_name, format_string, field)		\static ssize_t mwave_show_##attr_name(struct device *dev, struct device_attribute *attr, char *buf)	\{									\	DSP_3780I_CONFIG_SETTINGS *pSettings =				\		&mwave_s_mdd.rBDData.rDspSettings;			\        return sprintf(buf, format_string, pSettings->field);		\}/* All of our attributes are read attributes. */#define mwave_dev_rd_attr(attr_name, format_string, field)		\	mwave_show_function(attr_name, format_string, field)		\static DEVICE_ATTR(attr_name, S_IRUGO, mwave_show_##attr_name, NULL)mwave_dev_rd_attr (3780i_dma, "%i\n", usDspDma);mwave_dev_rd_attr (3780i_irq, "%i\n", usDspIrq);mwave_dev_rd_attr (3780i_io, "%#.4x\n", usDspBaseIO);mwave_dev_rd_attr (uart_irq, "%i\n", usUartIrq);mwave_dev_rd_attr (uart_io, "%#.4x\n", usUartBaseIO);static struct device_attribute * const mwave_dev_attrs[] = {	&dev_attr_3780i_dma,	&dev_attr_3780i_irq,	&dev_attr_3780i_io,	&dev_attr_uart_irq,	&dev_attr_uart_io,};#endif/** mwave_init is called on module load** mwave_exit is called on module unload* mwave_exit is also used to clean up after an aborted mwave_init*/static void mwave_exit(void){	pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;	PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit entry\n");#if 0	for (i = 0; i < pDrvData->nr_registered_attrs; i++)		device_remove_file(&mwave_device, mwave_dev_attrs[i]);	pDrvData->nr_registered_attrs = 0;	if (pDrvData->device_registered) {		device_unregister(&mwave_device);		pDrvData->device_registered = FALSE;	}#endif	if ( pDrvData->sLine >= 0 ) {		serial8250_unregister_port(pDrvData->sLine);	}	if (pDrvData->bMwaveDevRegistered) {		misc_deregister(&mwave_misc_dev);	}	if (pDrvData->bDSPEnabled) {		tp3780I_DisableDSP(&pDrvData->rBDData);	}	if (pDrvData->bResourcesClaimed) {		tp3780I_ReleaseResources(&pDrvData->rBDData);	}	if (pDrvData->bBDInitialized) {		tp3780I_Cleanup(&pDrvData->rBDData);	}	PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit exit\n");}module_exit(mwave_exit);static int __init mwave_init(void){	int i;	int retval = 0;	pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;	PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_init entry\n");	memset(&mwave_s_mdd, 0, sizeof(MWAVE_DEVICE_DATA));	pDrvData->bBDInitialized = FALSE;	pDrvData->bResourcesClaimed = FALSE;	pDrvData->bDSPEnabled = FALSE;	pDrvData->bDSPReset = FALSE;	pDrvData->bMwaveDevRegistered = FALSE;	pDrvData->sLine = -1;	for (i = 0; i < ARRAY_SIZE(pDrvData->IPCs); i++) {		pDrvData->IPCs[i].bIsEnabled = FALSE;		pDrvData->IPCs[i].bIsHere = FALSE;		pDrvData->IPCs[i].usIntCount = 0;	/* no ints received yet */		init_waitqueue_head(&pDrvData->IPCs[i].ipc_wait_queue);	}	retval = tp3780I_InitializeBoardData(&pDrvData->rBDData);	PRINTK_2(TRACE_MWAVE,		"mwavedd::mwave_init, return from tp3780I_InitializeBoardData"		" retval %x\n",		retval);	if (retval) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd::mwave_init: Error:"				" Failed to initialize board data\n");		goto cleanup_error;	}	pDrvData->bBDInitialized = TRUE;	retval = tp3780I_CalcResources(&pDrvData->rBDData);	PRINTK_2(TRACE_MWAVE,		"mwavedd::mwave_init, return from tp3780I_CalcResources"		" retval %x\n",		retval);	if (retval) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd:mwave_init: Error:"				" Failed to calculate resources\n");		goto cleanup_error;	}	retval = tp3780I_ClaimResources(&pDrvData->rBDData);	PRINTK_2(TRACE_MWAVE,		"mwavedd::mwave_init, return from tp3780I_ClaimResources"		" retval %x\n",		retval);	if (retval) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd:mwave_init: Error:"				" Failed to claim resources\n");		goto cleanup_error;	}	pDrvData->bResourcesClaimed = TRUE;	retval = tp3780I_EnableDSP(&pDrvData->rBDData);	PRINTK_2(TRACE_MWAVE,		"mwavedd::mwave_init, return from tp3780I_EnableDSP"		" retval %x\n",		retval);	if (retval) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd:mwave_init: Error:"				" Failed to enable DSP\n");		goto cleanup_error;	}	pDrvData->bDSPEnabled = TRUE;	if (misc_register(&mwave_misc_dev) < 0) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd:mwave_init: Error:"				" Failed to register misc device\n");		goto cleanup_error;	}	pDrvData->bMwaveDevRegistered = TRUE;	pDrvData->sLine = register_serial_portandirq(		pDrvData->rBDData.rDspSettings.usUartBaseIO,		pDrvData->rBDData.rDspSettings.usUartIrq	);	if (pDrvData->sLine < 0) {		PRINTK_ERROR(KERN_ERR_MWAVE				"mwavedd:mwave_init: Error:"				" Failed to register serial driver\n");		goto cleanup_error;	}	/* uart is registered */#if 0	/* sysfs */	memset(&mwave_device, 0, sizeof (struct device));	snprintf(mwave_device.bus_id, BUS_ID_SIZE, "mwave");	if (device_register(&mwave_device))		goto cleanup_error;	pDrvData->device_registered = TRUE;	for (i = 0; i < ARRAY_SIZE(mwave_dev_attrs); i++) {		if(device_create_file(&mwave_device, mwave_dev_attrs[i])) {			PRINTK_ERROR(KERN_ERR_MWAVE					"mwavedd:mwave_init: Error:"					" Failed to create sysfs file %s\n",					mwave_dev_attrs[i]->attr.name);			goto cleanup_error;		}		pDrvData->nr_registered_attrs++;	}#endif	/* SUCCESS! */	return 0;cleanup_error:	PRINTK_ERROR(KERN_ERR_MWAVE			"mwavedd::mwave_init: Error:"			" Failed to initialize\n");	mwave_exit(); /* clean up */	return -EIO;}module_init(mwave_init);

⌨️ 快捷键说明

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