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

📄 dm642.c

📁 dm642的相关驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
}#endifstatic ssize_t dm642_read(struct file *filp, char *buf, unsigned long count){	return 0;}static ssize_t dm642_write(struct file *filp, char *buf, unsigned long count){	return 0;}static int dm642_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long point){	unsigned long ul;	unsigned long * pul;	int rt;	switch (cmd)	{		case IOCTL_BOOTDM642:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = bootdm642(point);					up(&dm642_sem);			return rt;		case IOCTL_START:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					startdm642(point);					up(&dm642_sem);			break;		case IOCTL_STOP:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					stopdm642(point);					up(&dm642_sem);			break;		case IOCTL_RESET:			resetdm642(point);			break;		case IOCTL_GET:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getdm642(point);					up(&dm642_sem);			return rt;		case IOCTL_INSERT_IFRAME:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					insertiframe(point);					up(&dm642_sem);			break;		case IOCTL_STOP_STATUS:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = stopdm642status(point);					up(&dm642_sem);			return rt;		case IOCTL_DSP_STOP	:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					dspstop(point);					up(&dm642_sem);			break;		case IOCTL_DSP_STOP_STATUS:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = dspstopstatus(point);					up(&dm642_sem);			return rt;		case IOCTL_SetVideoParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setvideoparams(point);					up(&dm642_sem);			return rt;		case IOCTL_GetVideoParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getvideoparams(point);					up(&dm642_sem);			return rt;		case IOCTL_SetCompressParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setcompressparams(point);					up(&dm642_sem);			return rt;		case IOCTL_GetCompressParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getcompressparams(point);					up(&dm642_sem);			return rt;		case IOCTL_GetSTANDARD:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getstandard(point);					up(&dm642_sem);			return rt;		case IOCTL_SetSTANDARD:			rt = setstandard(point);			return rt;		case IOCTL_SetOSDParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setosdparams(point);					up(&dm642_sem);			return rt;		case IOCTL_GetOSDParams:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getosdparams(point);					up(&dm642_sem);			return rt;		case IOCTL_SetDSPCLOCK:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setdspclock(point);					up(&dm642_sem);			return rt;		case IOCTL_SetOSDContral:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setosdcontral(point);					up(&dm642_sem);			return rt;		case IOCTL_GetOSDContral:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = getosdcontral(point);					up(&dm642_sem);			return rt;		case IOCTL_SetLOGO:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;					rt = setlogo(point);					up(&dm642_sem);			return rt;		case IOCTL_SetRTC:					setrtc(point);					break;		case IOCTL_GetRTC:			getrtc(point);			break;		case IOCTL_GetMAC:			getmac(point);			break;		case IOCTL_GetSer:			getser(point);			break;		case IOCTL_SetLed:			setlednum(point);			break;		case IOCTL_UpData:			rt = updata(point);			return rt;		case IOCTL_Version:			return VERSION;		case IOCTL_Flash:			rt=ioremap(0,0x10);			*((volatile unsigned short *)rt)=0xff;			break;#ifdef Design_For_GDW		case IOCTL_UserData:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = userdata(point);						up(&dm642_sem);			return rt;		case IOCTL_Pass:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = pass(point);						up(&dm642_sem);			return rt;		case IOCTL_WatchDog:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = watchdog(point);						up(&dm642_sem);			return rt;		case IOCTL_SendSerial:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = sendserial(point);						up(&dm642_sem);			return rt;		case IOCTL_RecieveUserData:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = recieveuserdata(point);						up(&dm642_sem);			return rt;		case IOCTL_RecieveSerial:			if (down_interruptible(&dm642_sem) != 0)				return -EINTR;						rt = recievesendserial(point);						up(&dm642_sem);			return rt;#endif		default:	}	return 0;}static int dm642_open(struct inode *inode, struct file *file){	return 0;}static int dm642_release(struct inode *inode, struct file *filp){	return 0;}struct file_operations dm642_fops = {	read:dm642_read,	write:dm642_write,	ioctl:dm642_ioctl,	open:dm642_open,	release:dm642_release,};static void dm642_irq_rtc(int irq, void *dev_id, struct pt_regs *regs){	int i,j;	unsigned long ul1,ul2;	for(i=0;i<4;i++)	{		if((osdparam[i].LINE0_TYPE & 0x0ffff) == 0)		{			continue;		}		else		{			setosdbuf(osdparam[i].LINE0_TYPE, &osdparam[i].LINE_BUF[0]);		}		ul1 = __REG(0x57000078) & 0x0f;		ul2 = ((__REG(0x57000078) >> 4) * 10 + ul1) * 3600;		ul1 = __REG(0x57000074) & 0x0f;		ul2 += ((__REG(0x57000074) >> 4) * 10 + ul1) * 60;		ul1 = __REG(0x57000070) & 0x0f;		ul1 += (__REG(0x57000070) >> 4) * 10;		if(ul1 == 0)		{			ul1 = __REG(0x57000078) & 0x0f;			ul2 = ((__REG(0x57000078) >> 4) * 10 + ul1) * 3600;			ul1 = __REG(0x57000074) & 0x0f;			ul2 += ((__REG(0x57000074) >> 4) * 10 + ul1) * 60;			ul1 = __REG(0x57000070) & 0x0f;			ul1 += (__REG(0x57000070) >> 4) * 10;		}		ul2 += ul1;		*(volatile unsigned long *)(iomap+4) = OSD_HOST_CLOCK_SECS0 + i * 128;		*(volatile unsigned long *)(iomap+8) = ul2;		*(volatile unsigned long *)(iomap+8) = 1;		*(volatile unsigned long *)(iomap+4) = 0x81ffc000 + i * 128;		for(j=0; j<16; j++)		{			*(volatile unsigned long *)(iomap+8) = osdparam[i].LINE_BUF[j];		}		*(volatile unsigned long *)(iomap+4) = OSD_MODIFY_FLAG0 + i * 128;		j = *(volatile unsigned long *)(iomap+0x1c);		*(volatile unsigned long *)(iomap+8) = 0x00010000 | j;		*(volatile unsigned long *)(iomap+4) = SET_OSDPARAM_FUNC0 + i * 128;		*(volatile unsigned long *)(iomap+8) = 1;	}	*(volatile unsigned long *)(iomap+0) = 0x00020002;}static void dm642_irq_isr(int irq, void *dev_id, struct pt_regs *regs){#ifdef Design_For_GDW	int i;	unsigned long passaddr;	*(volatile unsigned long *)(iomap+4) = PASS_RECEIVEDFLAG;	if(*(volatile unsigned long *)(iomap+0x18) == 0)	{		*(volatile unsigned long *)(iomap+4) = PASS_ADDRESS;		passaddr = *(volatile unsigned long *)(iomap+0x18);		*(volatile unsigned long *)(iomap+8) = g_pass_size;		*(volatile unsigned long *)(iomap+4) = passaddr;		printk("password:");		for(i=0; i<4; i++)		{			*(volatile unsigned long *)(iomap+8)=g_pass[i];			printk("%.8x ",g_pass[i]);		}		printk("\n");		*(volatile unsigned long *)(iomap+4) = PASS_RECEIVEDFLAG;		*(volatile unsigned long *)(iomap+8) = 1;	}#endif	*(volatile unsigned long *)(iomap+0) = 0x00040004;}static int __init DM642_init(void){	unsigned long ul;	int rc;	unsigned char buf[0x30];	struct ioctl_get_rtc srtc;	printk("____________**********DM642 init ok! Version %x**********\n", VERSION);	set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G1);	write_gpio_bit(GPIO_G1,1);	sema_init(&dm642_sem,1);	getbuf_flag[0]=0;	getbuf_flag[1]=0;	getbuf_flag[2]=0;	getbuf_flag[3]=0;	osdparam[0].LINE0_TYPE = 0;	osdparam[1].LINE0_TYPE = 0;	osdparam[2].LINE0_TYPE = 0;	osdparam[3].LINE0_TYPE = 0;	frameon[0] = 1;	frameoff[0] = 0;	frameon[1] = 1;	frameoff[1] = 0;	frameon[2] = 1;	frameoff[2] = 0;	frameon[3] = 1;	frameoff[3] = 0;	g_I_QUANT[0]=31;	g_P_QUANT[0]=31;	g_I_QUANT[1]=31;	g_P_QUANT[1]=31;	g_I_QUANT[2]=31;	g_P_QUANT[2]=31;	g_I_QUANT[3]=31;	g_P_QUANT[3]=31;	g_SIZEX[0]=352;	g_SIZEX[1]=352;	g_SIZEX[2]=352;	g_SIZEX[3]=352;	logomap = ioremap(0x00020000,4*32*1024);	iomap = ioremap(DM642_IOADDR, DM642_IOSIZE);	tiomap = ioremap(0x08000300, 0x400);	led = 0;	setled=64;	ul = __REG(0x48000000);	ul &= 0xfffff0ff;	ul |= 0x00000600;	__REG(0x48000000) = ul;	__REG(0x48000008) = 0x0b00;	__REG(0x4800000c) = 0x0b00;	maciomap = ioremap(0x00420000,0x30);	set_external_irq(IRQ_RTC, EXT_FALLING_EDGE, GPIO_PULLUP_EN);			rc = request_irq(IRQ_RTC, dm642_irq_rtc, SA_INTERRUPT, "rtc", NULL);	if (rc)	{		printk("dm642 IRQ_RTC not registered. Error: %d\n", rc);	}	kgetrtc(&srtc);	if((srtc.second>59) ||(srtc.minute>59) ||(srtc.hour>23) ||(srtc.day>31) ||(srtc.week>7) ||(srtc.month>12) ||(srtc.year>99))	{		srtc.second = 0;		srtc.minute = 0;		srtc.hour = 0;		srtc.day = 1;		srtc.week = 2;		srtc.month = 1;		srtc.year = 8;		ksetrtc(&srtc);	}	set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_B5);	resetdm642(0);	set_external_irq(IRQ_EINT2, EXT_FALLING_EDGE, GPIO_PULLUP_EN);	disable_irq(IRQ_EINT2);	enable_irq(IRQ_EINT2);	rc = request_irq(IRQ_EINT2, dm642_irq_isr, SA_INTERRUPT, "dm642", NULL);	if (rc)	{		printk("dm642 IRQ_EINT2 not registered. Error: %d\n", rc);	}	devfs_dm642 = devfs_register(NULL,"dm642",DEVFS_FL_DEFAULT,DM642_MAJOR,0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP,&dm642_fops, NULL);		write_gpio_bit(GPIO_G1,0);	return 0;}static void __exit DM642_exit(void){		free_irq(IRQ_RTC, NULL);	disable_irq(IRQ_EINT2);	free_irq(IRQ_EINT2, NULL);	iounmap(iomap);	iounmap(logomap);	iounmap(maciomap);	devfs_unregister(devfs_dm642);}module_init(DM642_init);module_exit(DM642_exit);

⌨️ 快捷键说明

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