matrix5-leds.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/config.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. #include <linux/miscdevice.h>
  6. #include <linux/sched.h>
  7. #include <linux/delay.h>
  8. #include <linux/poll.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/irq.h>
  11. #include <linux/delay.h>
  12. #include <asm/hardware.h>
  13. #define DEVICE_NAME "leds"
  14. #define LED_MAJOR 231
  15. static unsigned long led_table [] = {
  16. GPIO_B7,
  17. GPIO_B8,
  18. GPIO_B9,
  19. GPIO_B10,
  20. };
  21. static int matrix4_leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  22. {
  23. switch(cmd) {
  24. case 0:
  25. case 1:
  26. if (arg > 4) {
  27. return -EINVAL;
  28. }
  29. write_gpio_bit(led_table[arg], !cmd);
  30. default:
  31. return -EINVAL;
  32. }
  33. }
  34. static struct file_operations matrix4_leds_fops = {
  35. owner: THIS_MODULE,
  36. ioctl:  matrix4_leds_ioctl,
  37. };
  38. static devfs_handle_t devfs_handle;
  39. static int __init matrix4_leds_init(void)
  40. {
  41. int ret;
  42. int i;
  43. ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &matrix4_leds_fops);
  44. if (ret < 0) {
  45.   printk(DEVICE_NAME " can't register major numbern");
  46.   return ret;
  47. }
  48. devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,
  49. LED_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &matrix4_leds_fops, NULL);
  50. for (i = 0; i < 8; i++) {
  51. set_gpio_ctrl (led_table[i] | GPIO_PULLUP_EN | GPIO_MODE_OUT);
  52. write_gpio_bit(led_table[i], 1);
  53. }
  54. printk(DEVICE_NAME " initializedn");
  55. return 0;
  56. }
  57. static void __exit matrix4_leds_exit(void)
  58. {
  59. devfs_unregister(devfs_handle);
  60. unregister_chrdev(LED_MAJOR, DEVICE_NAME);
  61. }
  62. module_init(matrix4_leds_init);
  63. module_exit(matrix4_leds_exit);