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

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/module.h>
  2. #include <linux/types.h>
  3. #include <linux/init.h>
  4. #include <linux/sched.h>
  5. #include <linux/delay.h>
  6. #include <asm/io.h>
  7. #include <asm/irq.h>
  8. #include <asm/arch/syspld.h>
  9. #include "ssi_bus.h"
  10. #include "ssi_dev.h"
  11. extern struct ssi_bus clps711x_ssi1_bus;
  12. static u_int recvbuf[16];
  13. static volatile u_int ptr, rxed;
  14. static inline void juno_enable_irq(void)
  15. {
  16. enable_irq(IRQ_EINT1);
  17. }
  18. static inline void juno_disable_irq(void)
  19. {
  20. disable_irq(IRQ_EINT1);
  21. }
  22. static void juno_rcv(struct ssi_dev *dev, u_int data)
  23. {
  24. if (ptr < 16) {
  25. recvbuf[ptr] = data;
  26. ptr++;
  27. } else
  28. printk("juno_rcv: %04xn", data);
  29. rxed = 1;
  30. }
  31. static void juno_irq(int irq, void *dev_id, struct pt_regs *regs)
  32. {
  33. struct ssi_dev *dev = dev_id;
  34. printk("juno_irqn");
  35. ssi_select_device(dev->bus, dev);
  36. ptr = 0;
  37. do {
  38. rxed = 0;
  39. ssi_transmit_data(dev, 0xff);
  40. while (rxed == 0);
  41. udelay(150);
  42. } while (PLD_INT & PLD_INT_KBD_ATN);
  43. ssi_select_device(dev->bus, NULL);
  44. { int i;
  45.   printk("juno_rcv: ");
  46.   for (i = 0; i < ptr; i++)
  47.    printk("%04x ", recvbuf[i]);
  48.   printk("n");
  49. }
  50. }
  51. static void juno_command(struct ssi_dev *dev, int cmd, int data)
  52. {
  53. ssi_transmit_data(dev, cmd);
  54. mdelay(1);
  55. ssi_transmit_data(dev, data);
  56. mdelay(1);
  57. ssi_transmit_data(dev, 0xa0 ^ 0xc0);
  58. mdelay(1);
  59. }
  60. static int juno_dev_init(struct ssi_dev *dev)
  61. {
  62. int retval;
  63. PLD_KBD |= PLD_KBD_EN;
  64. ptr = 16;
  65. mdelay(20);
  66. retval = request_irq(IRQ_EINT1, juno_irq, 0, dev->name, dev);
  67. if (retval)
  68. return retval;
  69. juno_disable_irq();
  70. if (ssi_select_device(dev->bus, dev) != 0) {
  71. printk("juno: ssi_select_dev failedn");
  72. return -EBUSY;
  73. }
  74. mdelay(1);
  75. juno_command(dev, 0x80, 0x20);
  76. ssi_select_device(dev->bus, NULL);
  77. juno_enable_irq();
  78. return 0;
  79. }
  80. static struct ssi_dev juno_dev = {
  81. name: "Juno",
  82. id: 0,
  83. proto: SSI_USAR,
  84. cfglen: 8,
  85. framelen: 8,
  86. clkpol: 1,
  87. clkfreq: 250000,
  88. rcv: juno_rcv,
  89. init: juno_dev_init,
  90. };
  91. static int __init juno_init(void)
  92. {
  93. return ssi_register_device(&clps711x_ssi1_bus, &juno_dev);
  94. }
  95. static void __exit juno_exit(void)
  96. {
  97. ssi_unregister_device(&juno_dev);
  98. }
  99. module_init(juno_init);
  100. module_exit(juno_exit);