Browse Source

Granite edition

Daniele Lacamera 1 month ago
parent
commit
b0143daee6
5 changed files with 146 additions and 39 deletions
  1. 2 0
      CMakeLists.txt
  2. 54 0
      Makefile
  3. BIN
      src/.main.c.swp
  4. 88 37
      src/main.c
  5. 2 2
      src/usb_descriptors.c

+ 2 - 0
CMakeLists.txt

@@ -23,6 +23,8 @@ target_include_directories(${PROJECT} PUBLIC
         ${CMAKE_CURRENT_SOURCE_DIR}/src
         )
 
+        target_link_libraries(${PROJECT} PUBLIC pico_stdlib hardware_adc hardware_flash)
+
 # Configure compilation flags and libraries for the example... see the corresponding function
 # in hw/bsp/FAMILY/family.cmake for details.
 family_configure_device_example(${PROJECT})

+ 54 - 0
Makefile

@@ -853,6 +853,30 @@ pico-sdk/src/common/pico_util/queue.c.s:
 	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/common/pico_util/queue.c.s
 .PHONY : pico-sdk/src/common/pico_util/queue.c.s
 
+pico-sdk/src/rp2_common/hardware_adc/adc.obj: pico-sdk/src/rp2_common/hardware_adc/adc.c.obj
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.obj
+
+# target to build an object file
+pico-sdk/src/rp2_common/hardware_adc/adc.c.obj:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_adc/adc.c.obj
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.c.obj
+
+pico-sdk/src/rp2_common/hardware_adc/adc.i: pico-sdk/src/rp2_common/hardware_adc/adc.c.i
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.i
+
+# target to preprocess a source file
+pico-sdk/src/rp2_common/hardware_adc/adc.c.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_adc/adc.c.i
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.c.i
+
+pico-sdk/src/rp2_common/hardware_adc/adc.s: pico-sdk/src/rp2_common/hardware_adc/adc.c.s
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.s
+
+# target to generate assembly for a file
+pico-sdk/src/rp2_common/hardware_adc/adc.c.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_adc/adc.c.s
+.PHONY : pico-sdk/src/rp2_common/hardware_adc/adc.c.s
+
 pico-sdk/src/rp2_common/hardware_claim/claim.obj: pico-sdk/src/rp2_common/hardware_claim/claim.c.obj
 .PHONY : pico-sdk/src/rp2_common/hardware_claim/claim.obj
 
@@ -909,6 +933,30 @@ pico-sdk/src/rp2_common/hardware_divider/divider.S.obj:
 	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_divider/divider.S.obj
 .PHONY : pico-sdk/src/rp2_common/hardware_divider/divider.S.obj
 
+pico-sdk/src/rp2_common/hardware_flash/flash.obj: pico-sdk/src/rp2_common/hardware_flash/flash.c.obj
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.obj
+
+# target to build an object file
+pico-sdk/src/rp2_common/hardware_flash/flash.c.obj:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_flash/flash.c.obj
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.c.obj
+
+pico-sdk/src/rp2_common/hardware_flash/flash.i: pico-sdk/src/rp2_common/hardware_flash/flash.c.i
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.i
+
+# target to preprocess a source file
+pico-sdk/src/rp2_common/hardware_flash/flash.c.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_flash/flash.c.i
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.c.i
+
+pico-sdk/src/rp2_common/hardware_flash/flash.s: pico-sdk/src/rp2_common/hardware_flash/flash.c.s
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.s
+
+# target to generate assembly for a file
+pico-sdk/src/rp2_common/hardware_flash/flash.c.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/kempston-mod.dir/build.make CMakeFiles/kempston-mod.dir/pico-sdk/src/rp2_common/hardware_flash/flash.c.s
+.PHONY : pico-sdk/src/rp2_common/hardware_flash/flash.c.s
+
 pico-sdk/src/rp2_common/hardware_gpio/gpio.obj: pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj
 .PHONY : pico-sdk/src/rp2_common/hardware_gpio/gpio.obj
 
@@ -1734,6 +1782,9 @@ help:
 	@echo "... pico-sdk/src/common/pico_util/queue.obj"
 	@echo "... pico-sdk/src/common/pico_util/queue.i"
 	@echo "... pico-sdk/src/common/pico_util/queue.s"
+	@echo "... pico-sdk/src/rp2_common/hardware_adc/adc.obj"
+	@echo "... pico-sdk/src/rp2_common/hardware_adc/adc.i"
+	@echo "... pico-sdk/src/rp2_common/hardware_adc/adc.s"
 	@echo "... pico-sdk/src/rp2_common/hardware_claim/claim.obj"
 	@echo "... pico-sdk/src/rp2_common/hardware_claim/claim.i"
 	@echo "... pico-sdk/src/rp2_common/hardware_claim/claim.s"
@@ -1741,6 +1792,9 @@ help:
 	@echo "... pico-sdk/src/rp2_common/hardware_clocks/clocks.i"
 	@echo "... pico-sdk/src/rp2_common/hardware_clocks/clocks.s"
 	@echo "... pico-sdk/src/rp2_common/hardware_divider/divider.obj"
+	@echo "... pico-sdk/src/rp2_common/hardware_flash/flash.obj"
+	@echo "... pico-sdk/src/rp2_common/hardware_flash/flash.i"
+	@echo "... pico-sdk/src/rp2_common/hardware_flash/flash.s"
 	@echo "... pico-sdk/src/rp2_common/hardware_gpio/gpio.obj"
 	@echo "... pico-sdk/src/rp2_common/hardware_gpio/gpio.i"
 	@echo "... pico-sdk/src/rp2_common/hardware_gpio/gpio.s"

BIN
src/.main.c.swp


+ 88 - 37
src/main.c

@@ -29,6 +29,7 @@
 
 #include "bsp/board.h"
 #include "hardware/gpio.h"
+#include "hardware/adc.h"
 #include "tusb.h"
 
 #include "usb_descriptors.h"
@@ -48,18 +49,25 @@ enum  {
   BLINK_SUSPENDED = 2500,
 };
 
-#define J_UP 14
-#define J_DOWN 12
-#define J_RIGHT 15
-#define J_LEFT 13
-#define J_FIRE1 16
-#define J_FIRE2 17
-#define J_FIRE3 19
-#define J_FIRE4 21
-#define J_FIRE5 22
-#define J_FIRE6 23
-#define J_START 0
-#define J_SELECT 4
+#define J_UP        21
+#define J_DOWN      20
+#define J_LEFT      19
+#define J_RIGHT     18
+#define J_FIRE1     8 /* south */
+#define J_FIRE2     7 /* north */
+#define J_FIRE3     10 /* east */
+#define J_FIRE4     6  /* west */
+#define J_FIRE5     12 /* TL */
+#define J_FIRE6     13 /* TR */
+#define J_FIRE7     4  /* TL2 */
+#define J_FIRE8     9  /* TR2 */
+#define J_START     5
+#define J_SELECT    11
+
+#define POT         27 /* Sensitivity / mode change */
+#define POT_ADC     1 /* ADC1 */
+
+#define LED_DIGITAL 28
 
 static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
 
@@ -131,63 +139,88 @@ static void send_hid_report(uint8_t report_id, uint32_t btn)
     {
       // use to avoid send multiple consecutive zero report for keyboard
       static bool has_gamepad_key = false;
+      static int32_t prog_x = 0, prog_y = 0;
+      uint32_t pot_val = 0;
+      uint32_t gpio_mask = gpio_get_all();
+
 
       hid_gamepad_report_t report =
       {
-        .x   = 1, .y = 0, .z = 0, .rz = 0, .rx = 0, .ry = 0,
+        .x   = 0, .y = 0, .z = 0, .rz = 0, .rx = 0, .ry = 0,
         .hat = 0, .buttons = 0
       };
 
-      if (gpio_get(J_UP) == 0) {
-          report.y = -127;
-      } else if (gpio_get(J_DOWN) == 0) {
-          report.y = 127;
+      if ((gpio_mask & (1<<J_UP)) == 0) {
+          report.y = -1;
+      } else if ((gpio_mask & (1<<J_DOWN)) == 0) {
+          report.y = 1;
+      }
+      if ((gpio_mask & (1<<J_RIGHT)) == 0) {
+          report.x = 1;
+      } else if ((gpio_mask & (1<<J_LEFT)) == 0) {
+          report.x = -1;
       }
-      if (gpio_get(J_RIGHT) == 0) {
-          report.x = 127;
-      } else if (gpio_get(J_LEFT) == 0) {
-          report.x = -127;
+
+      adc_select_input(POT_ADC);
+      pot_val = adc_read();
+
+       if (pot_val < 4000) {
+           if (pot_val >  32) {
+              /* Tune intensity */
+              report.x *= (pot_val >> 5);
+              report.y *= (pot_val >> 5);
+           }
+           gpio_put(LED_DIGITAL, 0);
+      } else { 
+          /* Digital mode */
+          report.x *= 127;
+          report.y *= 127;
+          gpio_put(LED_DIGITAL, 1);
       }
 
       report.buttons = 0;
-      if (gpio_get(J_FIRE1) == 0) {
+      if ((gpio_mask & (1<<J_FIRE1)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_SOUTH;
       }
-      if (gpio_get(J_FIRE2) == 0) {
+      if ((gpio_mask & (1<<J_FIRE2)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_NORTH;
       }
-      if (gpio_get(J_FIRE3) == 0) {
+      if ((gpio_mask & (1<<J_FIRE3)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_EAST;
       }
-      if (gpio_get(J_FIRE4) == 0) {
+      if ((gpio_mask & (1<<J_FIRE4)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_WEST;
       }
-      if (gpio_get(J_FIRE5) == 0) {
-          report.buttons |= GAMEPAD_BUTTON_Z;
-      }
-      if (gpio_get(J_FIRE6) == 0) {
+      if ((gpio_mask & (1<<J_FIRE5)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_TL;
       }
-      if (gpio_get(J_START) == 0) {
+      if ((gpio_mask & (1<<J_FIRE6)) == 0) {
+          report.buttons |= GAMEPAD_BUTTON_TR;
+      }
+      if ((gpio_mask & (1<<J_FIRE7)) == 0) {
+          report.buttons |= GAMEPAD_BUTTON_TL2;
+      }
+      if ((gpio_mask & (1<<J_FIRE8)) == 0) {
+          report.buttons |= GAMEPAD_BUTTON_TR2;
+      }
+      if ((gpio_mask & (1<<J_START)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_START;
       }
-      if (gpio_get(J_SELECT) == 0) {
+      if ((gpio_mask & (1<<J_SELECT)) == 0) {
           report.buttons |= GAMEPAD_BUTTON_SELECT;
       }
       tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));
     }
     break;
-
-    default: break;
   }
 }
 
-// Every 10ms, we will sent 1 report for each HID profile (keyboard, mouse etc ..)
+// Every 5ms, we will sent 1 report for each HID profile (keyboard, mouse etc ..)
 // tud_hid_report_complete_cb() is used to send the next report after previous one is complete
 void hid_task(void)
 {
   // Poll every 10ms
-  const uint32_t interval_ms = 10;
+  const uint32_t interval_ms = 5;
   static uint32_t start_ms = 0;
   static int gpio_initialized = 0;
 
@@ -202,8 +235,14 @@ void hid_task(void)
       gpio_init(J_FIRE2);
       gpio_init(J_FIRE3);
       gpio_init(J_FIRE4);
+      gpio_init(J_FIRE5);
+      gpio_init(J_FIRE6);
+      gpio_init(J_FIRE7);
+      gpio_init(J_FIRE8);
       gpio_init(J_START);
       gpio_init(J_SELECT);
+      gpio_init(POT);
+      gpio_init(LED_DIGITAL);
 
       gpio_set_dir(J_UP, GPIO_IN);
       gpio_set_dir(J_DOWN, GPIO_IN);
@@ -213,9 +252,18 @@ void hid_task(void)
       gpio_set_dir(J_FIRE2, GPIO_IN);
       gpio_set_dir(J_FIRE3, GPIO_IN);
       gpio_set_dir(J_FIRE4, GPIO_IN);
+      gpio_set_dir(J_FIRE5, GPIO_IN);
+      gpio_set_dir(J_FIRE6, GPIO_IN);
+      gpio_set_dir(J_FIRE7, GPIO_IN);
+      gpio_set_dir(J_FIRE8, GPIO_IN);
       gpio_set_dir(J_START, GPIO_IN);
       gpio_set_dir(J_SELECT, GPIO_IN);
 
+      gpio_set_dir(LED_DIGITAL, GPIO_OUT);
+
+      adc_init();
+      adc_gpio_init(POT);
+
       gpio_pull_up(J_UP);
       gpio_pull_up(J_DOWN);
       gpio_pull_up(J_LEFT);
@@ -224,14 +272,17 @@ void hid_task(void)
       gpio_pull_up(J_FIRE2);
       gpio_pull_up(J_FIRE3);
       gpio_pull_up(J_FIRE4);
+      gpio_pull_up(J_FIRE5);
+      gpio_pull_up(J_FIRE6);
+      gpio_pull_up(J_FIRE7);
+      gpio_pull_up(J_FIRE8);
       gpio_pull_up(J_START);
       gpio_pull_up(J_SELECT);
       gpio_initialized++;
   }
 
-
   if ( board_millis() - start_ms < interval_ms) return; // not enough time
-  start_ms += interval_ms;
+      start_ms += interval_ms;
 
   // Remote wakeup
   if ( tud_suspended())

+ 2 - 2
src/usb_descriptors.c

@@ -179,8 +179,8 @@ char const* string_desc_arr [] =
 {
   (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
   "Danielinux",                     // 1: Manufacturer
-  "Kempston-mod",                 // 2: Product
-  "001980",                      // 3: Serials, should use chip ID
+  "Granite-arcade-JS",                 // 2: Product
+  "031980",                      // 3: Serials, should use chip ID
 };
 
 static uint16_t _desc_str[32];