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

📄 mwavedd.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
					interruptible_sleep_on(&pDrvData->IPCs[ipcnum].ipc_wait_queue);					pDrvData->IPCs[ipcnum].bIsHere = FALSE;					if (pDrvData->IPCs[ipcnum].usIntCount == 1) {						pDrvData->IPCs[ipcnum].						usIntCount = 2;					}					spin_unlock_irqrestore(&ipc_lock, flags);					PRINTK_2(TRACE_MWAVE,						"mwavedd::mwave_ioctl IOCTL_MW_GET_IPC ipcnum %x woke up and returning to application\n",						ipcnum);				}				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 > 16) {				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 *buf, size_t count,                          loff_t * ppos){	PRINTK_5(TRACE_MWAVE,		"mwavedd::mwave_read entry file %p, buf %p, count %x ppos %p\n",		file, buf, count, ppos);	return -EINVAL;}static ssize_t mwave_write(struct file *file, const char *buf,                           size_t count, loff_t * ppos){	PRINTK_5(TRACE_MWAVE,		"mwavedd::mwave_write entry file %p, buf %p, count %x ppos %p\n",		file, buf, count, ppos);	return -EINVAL;}static int register_serial_portandirq(unsigned int port, int irq){	struct serial_struct serial;	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(&serial, 0, sizeof(serial));	serial.port = port;	serial.irq = irq;	serial.flags = ASYNC_SHARE_IRQ;	return register_serial(&serial);}#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)static struct file_operations mwave_fops = {	owner:THIS_MODULE,	read:mwave_read,	write:mwave_write,	ioctl:mwave_ioctl,	open:mwave_open,	release:mwave_close};#elsestatic struct file_operations mwave_fops = {	NULL,			/* lseek */	mwave_read,		/* read */	mwave_write,		/* write */	NULL,			/* readdir */	NULL,			/* poll */	mwave_ioctl,		/* ioctl */	NULL,			/* mmap */	mwave_open,		/* open */	NULL,			/* flush */	mwave_close		/* release */};#endifstatic struct miscdevice mwave_misc_dev = { MWAVE_MINOR, "mwave", &mwave_fops };/** 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 (pDrvData->bProcEntryCreated) {#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)		remove_proc_entry("mwave", NULL);#else		proc_unregister(&proc_root, mwave_proc.low_ino);#endif	}	if ( pDrvData->sLine >= 0 ) {		unregister_serial(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;	unsigned int resultMiscRegister;	pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;	memset(&mwave_s_mdd, 0, sizeof(MWAVE_DEVICE_DATA));	PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_init entry\n");	pDrvData->bBDInitialized = FALSE;	pDrvData->bResourcesClaimed = FALSE;	pDrvData->bDSPEnabled = FALSE;	pDrvData->bDSPReset = FALSE;	pDrvData->bMwaveDevRegistered = FALSE;	pDrvData->sLine = -1;	pDrvData->bProcEntryCreated = FALSE;	for (i = 0; i < 16; i++) {		pDrvData->IPCs[i].bIsEnabled = FALSE;		pDrvData->IPCs[i].bIsHere = FALSE;		pDrvData->IPCs[i].usIntCount = 0;	/* no ints received yet */#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)		init_waitqueue_head(&pDrvData->IPCs[i].ipc_wait_queue);#endif	}	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;	resultMiscRegister = misc_register(&mwave_misc_dev);	if (resultMiscRegister < 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 (#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)		!create_proc_info_entry("mwave", 0, NULL, mwave_get_info)#else		proc_register(&proc_root, &mwave_proc)#endif	) {		PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_init: Error: Failed to register /proc/mwave\n");		goto cleanup_error;	}	pDrvData->bProcEntryCreated = TRUE;	/* 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);/** proc entry stuff added by Ian Pilcher <pilcher@us.ibm.com>*/#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)static int mwave_get_info(char *buf, char **start, off_t offset, int len){	DSP_3780I_CONFIG_SETTINGS *pSettings = &mwave_s_mdd.rBDData.rDspSettings;	char *out = buf;	out += sprintf(out, "3780i_IRQ %i\n", pSettings->usDspIrq);	out += sprintf(out, "3780i_DMA %i\n", pSettings->usDspDma);	out += sprintf(out, "3780i_IO  %#.4x\n", pSettings->usDspBaseIO);	out += sprintf(out, "UART_IRQ  %i\n", pSettings->usUartIrq);	out += sprintf(out, "UART_IO   %#.4x\n", pSettings->usUartBaseIO);	return out - buf;}#else /* kernel version < 2.4.0 */static int mwave_read_proc(char *buf, char **start, off_t offset,                           int xlen, int unused){	DSP_3780I_CONFIG_SETTINGS *pSettings = &mwave_s_mdd.rBDData.rDspSettings;	int len;	len = sprintf(buf,        "3780i_IRQ %i\n", pSettings->usDspIrq);	len += sprintf(&buf[len], "3780i_DMA %i\n", pSettings->usDspDma);	len += sprintf(&buf[len], "3780i_IO  %#.4x\n", pSettings->usDspBaseIO);	len += sprintf(&buf[len], "UART_IRQ  %i\n", pSettings->usUartIrq);	len += sprintf(&buf[len], "UART_IO   %#.4x\n", pSettings->usUartBaseIO);	return len;}#endif

⌨️ 快捷键说明

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