static int __init briq_panel_init(void) { struct device_node *root = of_find_node_by_path("/"); const char *machine; int i; machine = of_get_property(root, "model", NULL); if (!machine || strncmp(machine, "TotalImpact,BRIQ-1", 18) != 0) { of_node_put(root); return -ENODEV; } of_node_put(root); printk(KERN_INFO "briq_panel: v%s Dr. Karsten Jeppesen ([email protected])\n", BRIQ_PANEL_VER); if (!request_region(BRIQ_PANEL_VFD_IOPORT, 4, "BRIQ Front Panel")) return -EBUSY; if (!request_region(BRIQ_PANEL_LED_IOPORT, 2, "BRIQ Front Panel")) { release_region(BRIQ_PANEL_VFD_IOPORT, 4); return -EBUSY; } ledpb = inb(BRIQ_PANEL_LED_IOPORT) & 0x000c; if (misc_register(&briq_panel_miscdev) < 0) { release_region(BRIQ_PANEL_VFD_IOPORT, 4); release_region(BRIQ_PANEL_LED_IOPORT, 2); return -EBUSY; } outb(0x38, BRIQ_PANEL_VFD_IOPORT); /* Function set */ outb(0x01, BRIQ_PANEL_VFD_IOPORT); /* Clear display */ outb(0x0c, BRIQ_PANEL_VFD_IOPORT); /* Display on */ outb(0x06, BRIQ_PANEL_VFD_IOPORT); /* Entry normal */ for (i=0; i<40; i++) vfd[i]=' '; #ifndef MODULE vfd[0] = 'L'; vfd[1] = 'o'; vfd[2] = 'a'; vfd[3] = 'd'; vfd[4] = 'i'; vfd[5] = 'n'; vfd[6] = 'g'; vfd[7] = ' '; vfd[8] = '.'; vfd[9] = '.'; vfd[10] = '.'; #endif /* !MODULE */ update_vfd(); return 0; }
static ssize_t briq_panel_write(struct file *file, const char __user *buf, size_t len, loff_t *ppos) { size_t indx = len; int i, esc = 0; #if 0 /* Can't seek (pwrite) on this device */ if (ppos != &file->f_pos) return -ESPIPE; #endif if (!vfd_is_open) return -EBUSY; for (;;) { char c; if (!indx) break; if (get_user(c, buf)) return -EFAULT; if (esc) { set_led(c); esc = 0; } else if (c == 27) { esc = 1; } else if (c == 12) { /* do a form feed */ for (i=0; i<40; i++) vfd[i] = ' '; vfd_cursor = 0; } else if (c == 10) { if (vfd_cursor < 20) vfd_cursor = 20; else if (vfd_cursor < 40) vfd_cursor = 40; else if (vfd_cursor < 60) vfd_cursor = 60; if (vfd_cursor > 59) scroll_vfd(); } else { /* just a character */ if (vfd_cursor > 39) scroll_vfd(); vfd[vfd_cursor++] = c; } indx--; buf++; } update_vfd(); return len; }
static ssize_t briq_panel_write(struct file *file, const char __user *buf, size_t len, loff_t *ppos) { size_t indx = len; int i, esc = 0; if (!vfd_is_open) return -EBUSY; for (;;) { char c; if (!indx) break; if (get_user(c, buf)) return -EFAULT; if (esc) { set_led(c); esc = 0; } else if (c == 27) { esc = 1; } else if (c == 12) { for (i=0; i<40; i++) vfd[i] = ' '; vfd_cursor = 0; } else if (c == 10) { if (vfd_cursor < 20) vfd_cursor = 20; else if (vfd_cursor < 40) vfd_cursor = 40; else if (vfd_cursor < 60) vfd_cursor = 60; if (vfd_cursor > 59) scroll_vfd(); } else { if (vfd_cursor > 39) scroll_vfd(); vfd[vfd_cursor++] = c; } indx--; buf++; } update_vfd(); return len; }