/* * Handle ioctl() calls from userspace: * Read or write the segments on single digits. * Note extensive error checking of arguments */ static long vga_led_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { vga_led_arg_t vla; switch (cmd) { case VGA_LED_WRITE_DIGIT: if (copy_from_user(&vla, (vga_led_arg_t *) arg, sizeof(vga_led_arg_t))) return -EACCES; /*if (vla.digit > 8)*/ /*return -EINVAL;*/ write_digit(vla.digit, vla.segments); break; case VGA_LED_READ_DIGIT: if (copy_from_user(&vla, (vga_led_arg_t *) arg, sizeof(vga_led_arg_t))) return -EACCES; if (vla.digit > 15) return -EINVAL; int a; a = ioread32(dev.virtbase + 4*vla.digit); vla.segments = a; // vla.segments = dev.segments[vla.digit]; if (copy_to_user((vga_led_arg_t *) arg, &vla, sizeof(vga_led_arg_t))) return -EACCES; break; default: return -EINVAL; } return 0; }
void write_number(int16_t number){ uint8_t h; int16_t format_num = number; //check if number is too big ot not if ((number < 10000) && (number >= 0)){ //formats number based on digits to correct digits on display for(h=0;h < num_digits;h++){ write_digit(format_num % 10, h); format_num /= 10; } } else { msg_error(); } }
/* * Handle ioctl() calls from userspace: * Read or write the segments on single digits. * Note extensive error checking of arguments */ static long vga_led_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { vga_led_arg_t vla; circ_center cc; switch (cmd) { case VGA_LED_WRITE_DIGIT: if (copy_from_user(&vla, (vga_led_arg_t *) arg, sizeof(vga_led_arg_t))) return -EACCES; if (vla.digit > 8) return -EINVAL; write_digit(vla.digit, vla.segments); break; case VGA_LED_READ_DIGIT: if (copy_from_user(&vla, (vga_led_arg_t *) arg, sizeof(vga_led_arg_t))) return -EACCES; if (vla.digit > 8) return -EINVAL; vla.segments = dev.segments[vla.digit]; if (copy_to_user((vga_led_arg_t *) arg, &vla, sizeof(vga_led_arg_t))) return -EACCES; break; case VGA_LED_WRITE_CENTER: if (copy_from_user(&cc, (circ_center *) arg, sizeof(circ_center))) return -EACCES; write_center(cc.cx, cc.cy); break; default: return -EINVAL; } return 0; }
void msg_error(void){ write_digit(10, 0); }