Advertisement
Rnery

Cabinet Driver writed in C

Feb 26th, 2024
1,093
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.83 KB | Source Code | 0 0
  1. // LPT Cabinet Driver writed in C
  2. // Alterado by Rnery
  3. #include <linux/kernel.h>
  4. #include <linux/delay.h>
  5. #include <linux/module.h>
  6. #include <linux/moduleparam.h>
  7. #include <linux/init.h>
  8. #include <linux/parport.h>
  9. #include <linux/input.h>
  10.  
  11. // UNCOMMENT FOR DEBUG :D
  12. // #define DEBUG_SPP
  13.  
  14. MODULE_AUTHOR("Rodrigo Nery <rodrigonery@hotmail.com.br>");
  15. MODULE_DESCRIPTION("A LPT Arcade Cabinet Driver for Linux");
  16. MODULE_LICENSE("GPL");
  17.  
  18. #define GC_MAX_PORTS 1
  19. #define GC_MAX_DEVICES 5
  20.  
  21. struct gc_config {
  22.     int args[GC_MAX_DEVICES + 1];
  23.     int nargs;
  24. };
  25.  
  26. static struct gc_config gc[GC_MAX_PORTS];
  27.  
  28. module_param_array(map, int, &gc[0].args, 0);
  29. MODULE_PARM_DESC(map, "Describes first set of devices (<parport#>,<pad1>,<pad2>,..<pad5>)");
  30.  
  31. #if GC_MAX_PORTS > 3
  32. module_param_array(map2, int, &gc[1].args, 0);
  33. MODULE_PARM_DESC(map2, "Describes second set of devices");
  34. module_param_array(map3, int, &gc[2].args, 0);
  35. MODULE_PARM_DESC(map3, "Describes third set of devices");
  36. #endif
  37.  
  38. ////////////////////////////////////
  39. // INITIAL PARAMETERS AND STRUCTS
  40.  
  41. // control types
  42. #define GC_ARCADE 1
  43. #define GC_KEY1 2
  44. #define GC_KEY2 3
  45. #define GC_KEY3 4
  46. #define GC_MAX 4
  47.  
  48. #define GC_REFRESH_TIME HZ / 100
  49.  
  50. struct gc {
  51.     struct pardevice *pd;
  52.     struct input_dev *dev[GC_MAX_DEVICES];
  53.     struct timer_list timer;
  54.     unsigned char pads[GC_MAX + 1];
  55.     int used;
  56.     char phys[GC_MAX_DEVICES][32];
  57.     struct mutex mutex;
  58. };
  59.  
  60. static struct gc *gc_base[GC_MAX_PORTS];
  61.  
  62. static int gc_status_bit[] = {0x40, 0x80, 0x20, 0x10, 0x08};
  63. static char *gc_names[] = {NULL, "Arcade Cabinet Control", "Arcade Cabinet Control Key1", "Arcade Cabinet Control Key2", "Arcade Cabinet Control Key3"};
  64.  
  65. /*
  66.  * Driver Arcade
  67.  */
  68.  
  69. #define GC_ARCADE_LENGTH 12
  70. #define GC_ARCADE_DELAY 15
  71.  
  72. static void gc_arcade_read_packet(struct gc *gc, int tam, unsigned char *data)
  73. {
  74.     unsigned char i;
  75.  
  76. #ifdef DEBUG_SPP
  77.     unsigned char tmp;
  78.     static int test[4] = {0xf, 0xf, 0xf, 0xf};
  79. #endif
  80.  
  81.     udelay(GC_ARCADE_DELAY); //waiting
  82.  
  83.     for (i = 0; i < (tam - 4); i++)
  84.     { //write 8 bits
  85.         parport_write_data(gc->pd->port, ~(1 << i)); //11111011 (0 open)
  86.         data[i] = parport_read_status(gc->pd->port) ^ 0x7f;
  87.  
  88. #ifdef DEBUG_SPP
  89.         if ((0x20 & data[i]) != 0)
  90.             printk(KERN_INFO "arcade.c: Read in %i! DATA[%x] \n", i, (0x20 & data[i]));
  91. #endif
  92.     }
  93.  
  94.     parport_write_data(gc->pd->port, 0xff); //cleaning
  95.     for (i = 8; (i < tam); i++)
  96.     {
  97.         if (i != 10) //INIT LINE
  98.             parport_write_control(gc->pd->port, (1 << (i - 8) | PARPORT_CONTROL_INIT));
  99.         else
  100.             parport_write_control(gc->pd->port, 0x0); //Active the INIT line (works inverted)
  101.  
  102.         data[i] = parport_read_status(gc->pd->port) ^ 0x7f; //filter
  103.  
  104. #ifdef DEBUG_SPP
  105.         tmp = parport_read_control(gc->pd->port);
  106.         if (test[(i - 8)] != data[i])
  107.         { //debug
  108.             test[(i - 8)] = data[i];
  109.             printk(KERN_INFO "arcade.c: HI - Change in %i! DATA[%x] - CONTROL[%x]\n", i, data[i], tmp);
  110.         }
  111. #endif
  112.     }
  113.  
  114.     parport_write_control(gc->pd->port, PARPORT_CONTROL_INIT); //clean
  115. }
  116.  
  117. #define GC_MAX_LENGTH GC_ARCADE_LENGTH
  118.  
  119. static void arcade_control_process_packet(struct gc *gc)
  120. {
  121.     unsigned char data[GC_MAX_LENGTH];
  122.     struct input_dev *dev;
  123.     int i, s;
  124.  
  125.     memset(data, 0, sizeof(char) * GC_MAX_LENGTH); //clean
  126.     gc_arcade_read_packet(gc, GC_ARCADE_LENGTH, data);
  127.  
  128.     for (i = 0; i < GC_MAX_DEVICES; i++)
  129.     {
  130.         dev = gc->dev[i];
  131.         if (!dev)
  132.             continue;
  133.  
  134.         s = gc_status_bit[i]; //set the bit to find
  135.  
  136.         if (s & (gc->pads[GC_ARCADE]))
  137.         { //check connected pads
  138.             input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3])); //left or right
  139.             input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1])); //up or down
  140.             input_report_key(dev, BTN_0, s & data[4]);                       //button 1
  141.             input_report_key(dev, BTN_1, s & data[5]);                       //button 2
  142.             input_report_key(dev, BTN_2, s & data[6]);                       //button 3
  143.             input_report_key(dev, BTN_3, s & data[7]);                       //button 4
  144.             //___________ USING CONTROL LINE ___________
  145.             input_report_key(dev, BTN_4, s & data[8]); //button 5
  146.             input_report_key(dev, BTN_5, s & data[9]); //button 6
  147.             input_report_key(dev, BTN_6, s & data[10]); //button 7
  148.             input_report_key(dev, BTN_7, s & data[11]); //button 8
  149.         }
  150.  
  151.         input_sync(dev);
  152.     }
  153. }
  154.  
  155. static void arcade_keyboard1_process_packet(struct gc *gc)
  156. {
  157.     unsigned char data[GC_MAX_LENGTH];
  158.     struct input_dev *dev;
  159.     int i, s;
  160.  
  161.     memset(data, 0, sizeof(char) * GC_MAX_LENGTH); //clean
  162.     gc_arcade_read_packet(gc, GC_ARCADE_LENGTH, data);
  163.  
  164.     for (i = 0; i < GC_MAX_DEVICES; i++)
  165.     {
  166.         dev = gc->dev[i];
  167.         if (!dev)
  168.             continue;
  169.  
  170.         s = gc_status_bit[i]; //set the bit to find
  171.  
  172.         if (s & (gc->pads[GC_KEY1]))
  173.         { //check connected pads
  174.             input_report_key(dev, KEY_UP, s & data[0]);      //up
  175.             input_report_key(dev, KEY_DOWN, s & data[1]);    //down
  176.             input_report_key(dev, KEY_LEFT, s & data[2]);    //left
  177.             input_report_key(dev, KEY_RIGHT, s & data[3]);   //right
  178.             input_report_key(dev, KEY_SPACE, s & data[4]);   //button 1
  179.             input_report_key(dev, KEY_ENTER, s & data[5]);   //button 2
  180.             input_report_key(dev, KEY_LEFTCTRL, s & data[6]); //button 3
  181.             input_report_key(dev, KEY_LEFTALT, s & data[7]);  //button 4
  182.         }
  183.  
  184.         input_sync(dev);
  185.     }
  186. }
  187.  
  188. static void arcade_keyboard2_process_packet(struct gc *gc)
  189. {
  190.     unsigned char data[GC_MAX_LENGTH];
  191.     struct input_dev *dev;
  192.     int i, s;
  193.  
  194.     memset(data, 0, sizeof(char) * GC_MAX_LENGTH); //clean
  195.     gc_arcade_read_packet(gc, GC_ARCADE_LENGTH, data);
  196.  
  197.     for (i = 0; i < GC_MAX_DEVICES; i++)
  198.     {
  199.         dev = gc->dev[i];
  200.         if (!dev)
  201.             continue;
  202.  
  203.         s = gc_status_bit[i]; //set the bit to find
  204.  
  205.         if (s & (gc->pads[GC_KEY2]))
  206.         { //check connected pads
  207.             input_report_key(dev, KEY_A, s & data[0]);   //button 1
  208.             input_report_key(dev, KEY_S, s & data[1]);   //button 2
  209.             input_report_key(dev, KEY_D, s & data[2]);   //button 3
  210.             input_report_key(dev, KEY_F, s & data[3]);   //button 4
  211.             input_report_key(dev, KEY_Q, s & data[4]);   //button 5
  212.             input_report_key(dev, KEY_W, s & data[5]);   //button 6
  213.             input_report_key(dev, KEY_E, s & data[6]);   //button 7
  214.             input_report_key(dev, KEY_R, s & data[7]);   //button 8
  215.             input_report_key(dev, KEY_LEFT, s & data[8]); //left
  216.             input_report_key(dev, KEY_RIGHT, s & data[9]);//right
  217.             input_report_key(dev, KEY_DOWN, s & data[10]);//down
  218.             input_report_key(dev, KEY_UP, s & data[11]);  //up
  219.         }
  220.  
  221.         input_sync(dev);
  222.     }
  223. }
  224.  
  225. static void arcade_keyboard3_process_packet(struct gc *gc)
  226. {
  227.     unsigned char data[GC_MAX_LENGTH];
  228.     struct input_dev *dev;
  229.     int i, s;
  230.  
  231.     memset(data, 0, sizeof(char) * GC_MAX_LENGTH); //clean
  232.     gc_arcade_read_packet(gc, GC_ARCADE_LENGTH, data);
  233.  
  234.     for (i = 0; i < GC_MAX_DEVICES; i++)
  235.     {
  236.         dev = gc->dev[i];
  237.         if (!dev)
  238.             continue;
  239.  
  240.         s = gc_status_bit[i]; //set the bit to find
  241.  
  242.         if (s & (gc->pads[GC_KEY3]))
  243.         { //check connected pads
  244.             input_report_key(dev, KEY_1, s & data[0]);   //button 1
  245.             input_report_key(dev, KEY_2, s & data[1]);   //button 2
  246.             input_report_key(dev, KEY_3, s & data[2]);   //button 3
  247.             input_report_key(dev, KEY_4, s & data[3]);   //button 4
  248.             input_report_key(dev, KEY_5, s & data[4]);   //button 5
  249.             input_report_key(dev, KEY_6, s & data[5]);   //button 6
  250.             input_report_key(dev, KEY_7, s & data[6]);   //button 7
  251.             input_report_key(dev, KEY_8, s & data[7]);   //button 8
  252.             input_report_key(dev, KEY_ESC, s & data[8]); //button 9
  253.             input_report_key(dev, KEY_TAB, s & data[9]); //button 10
  254.             input_report_key(dev, KEY_LEFT, s & data[10]);//left
  255.             input_report_key(dev, KEY_RIGHT, s & data[11]);//right
  256.         }
  257.  
  258.         input_sync(dev);
  259.     }
  260. }
  261.  
  262. static void arcade_timer(struct timer_list *t)
  263. {
  264.     struct gc *gc = from_timer(gc, t, timer);
  265.  
  266.     mutex_lock(&gc->mutex);
  267.  
  268.     switch (gc->used)
  269.     {
  270.     case GC_ARCADE:
  271.         arcade_control_process_packet(gc);
  272.         break;
  273.     case GC_KEY1:
  274.         arcade_keyboard1_process_packet(gc);
  275.         break;
  276.     case GC_KEY2:
  277.         arcade_keyboard2_process_packet(gc);
  278.         break;
  279.     case GC_KEY3:
  280.         arcade_keyboard3_process_packet(gc);
  281.         break;
  282.     }
  283.  
  284.     mutex_unlock(&gc->mutex);
  285.  
  286.     mod_timer(&gc->timer, jiffies + msecs_to_jiffies(GC_REFRESH_TIME));
  287. }
  288.  
  289. static int arcade_setup_control(struct gc *gc, int idx, int pad_type)
  290. {
  291.     gc->used = pad_type;
  292.     mutex_init(&gc->mutex);
  293.  
  294.     gc->timer.function = arcade_timer;
  295.     gc->timer.data = (unsigned long)gc;
  296.     timer_setup(&gc->timer, arcade_timer, 0);
  297.  
  298.     // ... (restante da função)
  299.  
  300.     return 0;
  301. }
  302.  
  303. static struct gc *arcade_probe(int parport, int *pads, int n_pads)
  304. {
  305.     // ... (restante da função)
  306.  
  307.     for (i = 0; i < GC_MAX_DEVICES; i++)
  308.     {
  309.         if (pads[i] == 0)
  310.             continue;
  311.  
  312.         gc->dev[i] = input_allocate_device();
  313.         if (!gc->dev[i])
  314.             goto err_free_dev;
  315.  
  316.         gc->dev[i]->evbit[0] = BIT_MASK(EV_KEY);
  317.         input_set_capability(gc->dev[i], EV_KEY, KEY_LEFT);
  318.         // ... (restante da função)
  319.     }
  320.  
  321.     // ... (restante da função)
  322.  
  323.     return gc;
  324.  
  325. err_free_dev:
  326.     for (i = 0; i < GC_MAX_DEVICES; i++)
  327.         if (gc->dev[i])
  328.             input_free_device(gc->dev[i]);
  329.  
  330.     kfree(gc);
  331.     return NULL;
  332. }
  333.  
  334. static int __init arcade_init(void)
  335. {
  336.     // ... (restante da função)
  337.  
  338.     for (i = 0; i < GC_MAX_PORTS; i++)
  339.     {
  340.         if (!gc_base[i])
  341.             continue;
  342.  
  343.         mutex_lock(&gc_base[i]->mutex);
  344.         setup_timer(&gc_base[i]->timer, arcade_timer, (unsigned long)gc_base[i]);
  345.         mod_timer(&gc_base[i]->timer, jiffies + msecs_to_jiffies(GC_REFRESH_TIME));
  346.         mutex_unlock(&gc_base[i]->mutex);
  347.     }
  348.  
  349.     // ... (restante da função)
  350.  
  351.     return 0;
  352. }
  353.  
  354. static void __exit arcade_exit(void)
  355. {
  356.     // ... (restante da função)
  357.  
  358.     for (i = 0; i < GC_MAX_PORTS; i++)
  359.     {
  360.         if (gc_base[i])
  361.         {
  362.             del_timer_sync(&gc_base[i]->timer);
  363.             mutex_destroy(&gc_base[i]->mutex);
  364.             kfree(gc_base[i]);
  365.         }
  366.     }
  367.  
  368.     // ... (restante da função)
  369. }
  370.  
  371. module_init(arcade_init);
  372. module_exit(arcade_exit);
  373.  
Tags: Driver
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement