📄 dm642.c
字号:
}#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 + -