void draw_thread(void *arg) { struct vfd_ioctl_data *data; struct vfd_ioctl_data draw_data; unsigned char buf[17]; int count = 0; int pos = 0; data = (struct vfd_ioctl_data *)arg; draw_data.length = data->length; memset(draw_data.data, 0, sizeof(draw_data.data)); memcpy(draw_data.data,data->data,data->length); thread_stop = 0; count = utf8_len(&draw_data.data[0], draw_data.length); if(count > mode_digit) { while(pos < draw_data.length) { if(kthread_should_stop()) { thread_stop = 1; return; } clear_display(); memset(buf,0, sizeof(buf)); int countb = utf8_count(&draw_data.data[pos], draw_data.length - pos, 8); memcpy(buf, &draw_data.data[pos], countb); YWPANEL_VFD_ShowString(buf); msleep(200); if (draw_data.data[pos] > 128) { pos += 2; } else { pos += 1; } } } if(count > 0) { clear_display(); memset(buf,0, sizeof(buf)); int countb = utf8_count(&draw_data.data[0], draw_data.length, 8); memcpy(buf, draw_data.data, countb); YWPANEL_VFD_ShowString(buf); } else VFD_clr(); thread_stop = 1; }
static int __init aotom_init_module(void) { int i; dprintk(5, "%s >\n", __func__); printk("Fulan front panel driver\n"); // sema_init(&display_sem,1); sema_init(&button_sem, 1); if(YWPANEL_VFD_Init(&mode_digit)) { printk("unable to init module\n"); return -1; } VFD_clr(); if(button_dev_init() != 0) return -1; if (register_chrdev(VFD_MAJOR,"VFD",&vfd_fops)) printk("unable to get major %d for VFD\n",VFD_MAJOR); sema_init(&write_sem, 1); // sema_init(&key_mutex, 1); for (i = 0; i < LASTMINOR; i++) sema_init(&FrontPanelOpen[i].sem, 1); own_proc_dir = create_proc_entry(NAME_DIR, S_IFDIR | S_IRWXUGO, NULL); if (own_proc_dir == NULL ) { printk(KERN_ERR "can't create /proc/%s\n", NAME_DIR); return -ENOMEM; } dprintk(5, "Create /proc/%s\n", NAME_DIR); own_proc_dir->gid =0 ; own_proc_node=create_proc_entry(NAME_NODE, S_IFREG | S_IRUGO | S_IWUGO, own_proc_dir); if (own_proc_node == NULL ) { printk(KERN_ERR "can't create /proc/%s/%s\n", NAME_DIR, NAME_NODE); return -ENOMEM; } dprintk(5, "Create /proc/%s/%s\n", NAME_DIR, NAME_NODE); own_proc_node->uid = 0; own_proc_node->gid =0 ; own_proc_node->read_proc=proc_node_read; dprintk(5, "%s <\n", __func__); return 0; }
static int __init aotom_init_module(void) { int i; dprintk(5, "%s >\n", __func__); printk("Fulan front panel driver\n"); if(YWPANEL_VFD_Init()) { printk("unable to init module\n"); return -1; } VFD_clr(); if(button_dev_init() != 0) return -1; if (register_chrdev(VFD_MAJOR,"VFD",&vfd_fops)) printk("unable to get major %d for VFD\n",VFD_MAJOR); if (pm_power_off) printk("pm_power_off hook already applied! Do not register anything\n"); else pm_power_off = aotom_standby; sema_init(&write_sem, 1); sema_init(&receive_sem, 1); sema_init(&draw_thread_sem, 1); for (i = 0; i < LASTMINOR; i++) { FrontPanelOpen[i].open_count = 0; FrontPanelOpen[i].minor = i; } for (i = 0; i < LASTLED; i++) { led_state[i].state = LOG_OFF; led_state[i].period = 0; led_state[i].stop = 1; sema_init(&led_state[i].led_sem, 0); led_state[i].led_task = kthread_run(led_thread, (void *) i, "led_thread"); } dprintk(5, "%s <\n", __func__); return 0; }