aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-02-20 11:10:20 -0500
committerGitHub <noreply@github.com>2017-02-20 11:10:20 -0500
commit7ff41df32c29bca4e3a6efc3047b8fa93bb99b92 (patch)
tree1f821ff584098a861ded7c72240ca8e0c8689bf8
parent49e72632d2200fc3bf71d5ced2aa43058da3b2e0 (diff)
parent76b1f392abb2a0cf4a7fa14a01818998f4de4d39 (diff)
downloadqmk_firmware-7ff41df32c29bca4e3a6efc3047b8fa93bb99b92.tar.gz
qmk_firmware-7ff41df32c29bca4e3a6efc3047b8fa93bb99b92.zip
Merge pull request #1097 from stanleylai/master
Added support for LED backlight, XD60v2's RGB underglow LED
-rw-r--r--keyboards/xd60/arrow-cluster.JPGbin1875718 -> 0 bytes
-rw-r--r--keyboards/xd60/config.h19
-rw-r--r--keyboards/xd60/keymaps/default/keymap.c40
-rw-r--r--keyboards/xd60/keymaps/stanleylai/keymap.c47
-rw-r--r--keyboards/xd60/readme.md8
-rw-r--r--keyboards/xd60/rules.mk2
-rw-r--r--keyboards/xd60/top-view.JPGbin2092542 -> 0 bytes
-rw-r--r--keyboards/xd60/xd60.h18
-rw-r--r--keyboards/xd60/xd60.jpgbin0 -> 2466209 bytes
9 files changed, 60 insertions, 74 deletions
diff --git a/keyboards/xd60/arrow-cluster.JPG b/keyboards/xd60/arrow-cluster.JPG
deleted file mode 100644
index aa03dc08e..000000000
--- a/keyboards/xd60/arrow-cluster.JPG
+++ /dev/null
Binary files differ
diff --git a/keyboards/xd60/config.h b/keyboards/xd60/config.h
index 13ae29063..4bbaec882 100644
--- a/keyboards/xd60/config.h
+++ b/keyboards/xd60/config.h
@@ -25,8 +25,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
25#define PRODUCT_ID 0x6060 25#define PRODUCT_ID 0x6060
26#define DEVICE_VER 0x0001 26#define DEVICE_VER 0x0001
27#define MANUFACTURER XIUDI 27#define MANUFACTURER XIUDI
28#define PRODUCT XD60 28#define PRODUCT XD60v2
29#define DESCRIPTION XD60 Keyboard by XIUDI 29#define DESCRIPTION XD60 v2 Keyboard PCB by XIUDI
30 30
31/* key matrix size */ 31/* key matrix size */
32#define MATRIX_ROWS 5 32#define MATRIX_ROWS 5
@@ -46,14 +46,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
46#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 } 46#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
47#define UNUSED_PINS 47#define UNUSED_PINS
48 48
49/* Backlight Setup */
50#define BACKLIGHT_PIN F5
51#define BACKLIGHT_LEVELS 6
52
49/* COL2ROW or ROW2COL */ 53/* COL2ROW or ROW2COL */
50#define DIODE_DIRECTION COL2ROW 54#define DIODE_DIRECTION COL2ROW
51 55
52/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ 56/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
53#define DEBOUNCING_DELAY 5 57#define DEBOUNCING_DELAY 5
54 58
55/* number of backlight levels */ 59/* RGB Underglow
56#define BACKLIGHT_LEVELS 3 60 * F6 PIN for XD60v2 that has pre-soldered WS2812 LEDs
61 */
62#define RGB_DI_PIN F6
63#define RGBLIGHT_ANIMATIONS
64#define RGBLED_NUM 6 // Number of LEDs
65#define RGBLIGHT_HUE_STEP 10
66#define RGBLIGHT_SAT_STEP 17
67#define RGBLIGHT_VAL_STEP 17
57 68
58/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ 69/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
59#define LOCKING_SUPPORT_ENABLE 70#define LOCKING_SUPPORT_ENABLE
diff --git a/keyboards/xd60/keymaps/default/keymap.c b/keyboards/xd60/keymaps/default/keymap.c
index ea85c02a3..11be9afca 100644
--- a/keyboards/xd60/keymaps/default/keymap.c
+++ b/keyboards/xd60/keymaps/default/keymap.c
@@ -9,56 +9,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
9 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ 9 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
10 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ 10 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
11 KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \ 11 KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \
12 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT), 12 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_LEFT, KC_DOWN, KC_RIGHT),
13 13
14 // 1: Function Layer 14 // 1: Function Layer
15 KEYMAP( 15 KEYMAP(
16 RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \ 16 RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \
17 KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ 17 KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \
18 KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ 18 KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \
19 KC_LSFT, KC_NO, KC_NO, KC_APP, BL_TOGG,BL_DEC, BL_INC, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_PGDN, KC_RSFT, KC_PGUP, KC_NO, \ 19 KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP,KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_PGDN, KC_RSFT, KC_PGUP, KC_INS, \
20 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, F(0), KC_HOME, KC_PGDOWN,KC_END), 20 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END),
21 21
22}; 22};
23 23
24// Custom Actions
24const uint16_t PROGMEM fn_actions[] = { 25const uint16_t PROGMEM fn_actions[] = {
25 [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay 26 [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay
26}; 27};
27 28
29// Macros
28const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { 30const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
29 // MACRODOWN only works in this function
30 31
32 // MACRODOWN only works in this function
31 switch(id) { 33 switch(id) {
32 case 0: 34 case 0:
33 if (record->event.pressed) { 35 if (record->event.pressed) { register_code(KC_RSFT); }
34 register_code(KC_RSFT); 36 else { unregister_code(KC_RSFT); }
35 } else { 37 break;
36 unregister_code(KC_RSFT);
37 }
38 break;
39 } 38 }
40 39
41 return MACRO_NONE; 40 return MACRO_NONE;
42}; 41};
43 42
43// Loop
44void matrix_scan_user(void) { 44void matrix_scan_user(void) {
45 45 // Empty
46 // Layer LED indicators
47 uint32_t layer = layer_state;
48
49 if (layer & (1<<1)) {
50 xd60_esc_led_on();
51 } else {
52 xd60_esc_led_off();
53 }
54
55 /*
56 if (layer & (1<<2)) {
57 xd60_poker_leds_on();
58 xd60_esc_led_on();
59 } else {
60 xd60_poker_leds_off();
61 xd60_esc_led_off();
62 }
63 */
64}; 46};
diff --git a/keyboards/xd60/keymaps/stanleylai/keymap.c b/keyboards/xd60/keymaps/stanleylai/keymap.c
index a84ee0f89..feb2cd1b6 100644
--- a/keyboards/xd60/keymaps/stanleylai/keymap.c
+++ b/keyboards/xd60/keymaps/stanleylai/keymap.c
@@ -8,53 +8,48 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
8 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ 8 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
9 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ 9 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
10 F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ 10 F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
11 KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \ 11 KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(1), KC_UP, KC_DEL, \
12 KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT), 12 KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT),
13 13
14 // 1: Function Layer 14 // 1: Function Layer
15 KEYMAP( 15 KEYMAP(
16 RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \ 16 RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \
17 KC_CAPS, KC_MPRV, KC_UP, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, BL_STEP, BL_TOGG, KC_DEL, \ 17 KC_CAPS, KC_MPRV, KC_UP, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, \
18 F(0), KC_LEFT, KC_DOWN, KC_RIGHT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ENT, \ 18 F(0), KC_LEFT, KC_DOWN, KC_RIGHT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ENT, \
19 KC_LSFT, KC_NO, KC_VOLD, KC_MUTE, KC_VOLU,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, KC_PGUP, KC_INS, \ 19 KC_LSFT, KC_NO, KC_VOLD, KC_MUTE, KC_VOLU,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_INS, \
20 KC_LCTL, KC_LALT, KC_LGUI, KC_MPLY, KC_RGUI, KC_RALT, KC_HOME, KC_PGDOWN,KC_END), 20 KC_LCTL, KC_LALT, KC_LGUI, KC_MPLY, KC_RGUI, KC_RALT, KC_HOME, KC_PGDOWN,KC_END),
21 21
22 // 2: RGB Layer
23 KEYMAP(
24 KC_NO, BL_TOGG, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
25 KC_NO, RGB_TOG, RGB_MOD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
26 KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
27 KC_NO, KC_NO, RGB_HUD, RGB_SAD, RGB_VAD,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, F(1), KC_NO, KC_NO, \
28 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
29
22}; 30};
23 31
32// Custom Actions
24const uint16_t PROGMEM fn_actions[] = { 33const uint16_t PROGMEM fn_actions[] = {
25 [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay 34 [0] = ACTION_LAYER_MOMENTARY(1), // to Function Layer
35 [1] = ACTION_LAYER_MOMENTARY(2), // to RGB Layer
26}; 36};
27 37
38// Macros
28const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { 39const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
29 // MACRODOWN only works in this function
30 40
41 // MACRODOWN only works in this function
31 switch(id) { 42 switch(id) {
32 case 0: 43 case 0:
33 if (record->event.pressed) { 44 if (record->event.pressed) { register_code(KC_RSFT); }
34 register_code(KC_RSFT); 45 else { unregister_code(KC_RSFT); }
35 } else { 46 break;
36 unregister_code(KC_RSFT);
37 }
38 break;
39 } 47 }
40 48
41 return MACRO_NONE; 49 return MACRO_NONE;
42}; 50};
43 51
52// Loop
44void matrix_scan_user(void) { 53void matrix_scan_user(void) {
45 54 // Empty
46 // Layer LED indicators
47 uint32_t layer = layer_state;
48
49 if (layer & (1<<1)) {
50 xd60_wasd_leds_on();
51 xd60_fn_led_on();
52 xd60_esc_led_on();
53 xd60_poker_leds_on();
54 } else {
55 xd60_wasd_leds_off();
56 xd60_fn_led_off();
57 xd60_esc_led_off();
58 xd60_poker_leds_off();
59 }
60}; 55};
diff --git a/keyboards/xd60/readme.md b/keyboards/xd60/readme.md
index 393ea5d68..224498caa 100644
--- a/keyboards/xd60/readme.md
+++ b/keyboards/xd60/readme.md
@@ -1,7 +1,6 @@
1# QMK Firmware for XIUDI's 60% XD60 PCB 1# QMK Firmware for XIUDI's 60% XD60 PCB
2 2
3![Top View of XD60 Keyboard, with DSA Dolch keycaps](./top-view.JPG) 3![Top View of a pair of XD60 Keyboard](./xd60.JPG)
4![Angled View of XD60 Keyboard Arrow Cluster, with DSA Dolch keycaps](./arrow-cluster.JPG)
5 4
6## Quantum MK Firmware 5## Quantum MK Firmware
7For the full Quantum feature list, see [the parent readme.md](/readme.md). 6For the full Quantum feature list, see [the parent readme.md](/readme.md).
@@ -9,5 +8,10 @@ For the full Quantum feature list, see [the parent readme.md](/readme.md).
9## Additional Notes 8## Additional Notes
10The XD60 is essentially a GH60 rev. C, with support for a right-hand arrow cluster. Includes full compatibility with GH60 expansion boards. Board also supports in-switch LEDs (two-pin, single colour), as well as WS2182 LED strips for underglow lighting. Default keymap included, matching configuration on sale page. 9The XD60 is essentially a GH60 rev. C, with support for a right-hand arrow cluster. Includes full compatibility with GH60 expansion boards. Board also supports in-switch LEDs (two-pin, single colour), as well as WS2182 LED strips for underglow lighting. Default keymap included, matching configuration on sale page.
11 10
11Version 2 PCBs include 6 soldered on RGB underglow LEDs on the bottom, and are labelled "XD60v2" on the top. They are otherwise identical to v1 PCBs.
12
13## Known Issues
14In-switch backlight LEDs seem to only support 1 brightness level.
15
12## Build 16## Build
13To build the default keymap, simply run `make xd60-default`. 17To build the default keymap, simply run `make xd60-default`.
diff --git a/keyboards/xd60/rules.mk b/keyboards/xd60/rules.mk
index e0b92121d..174c3ec84 100644
--- a/keyboards/xd60/rules.mk
+++ b/keyboards/xd60/rules.mk
@@ -61,5 +61,5 @@ MIDI_ENABLE = no # MIDI controls
61AUDIO_ENABLE = no # Audio output on port C6 61AUDIO_ENABLE = no # Audio output on port C6
62UNICODE_ENABLE = no # Unicode 62UNICODE_ENABLE = no # Unicode
63BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID 63BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
64RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. 64RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
65SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 65SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/xd60/top-view.JPG b/keyboards/xd60/top-view.JPG
deleted file mode 100644
index 613759b4d..000000000
--- a/keyboards/xd60/top-view.JPG
+++ /dev/null
Binary files differ
diff --git a/keyboards/xd60/xd60.h b/keyboards/xd60/xd60.h
index 36442cb52..dd5f63c0c 100644
--- a/keyboards/xd60/xd60.h
+++ b/keyboards/xd60/xd60.h
@@ -6,24 +6,18 @@
6 6
7/* XD60 LEDs 7/* XD60 LEDs
8 * GPIO pads 8 * GPIO pads
9 * 0 F7 WASD LEDs 9 * 0 F7 not connected
10 * 1 F6 ESC LED 10 * 1 F6 RGB PWM Underglow
11 * 2 F5 FN LED 11 * 2 F5 Backlight LED
12 * 3 F4 POKER Arrow LEDs 12 * 3 F4 not connected
13 * B2 Capslock LED 13 * B2 Capslock LED
14 * B0 not connected 14 * B0 not connected
15 */ 15 */
16inline void xd60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); } 16inline void xd60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
17inline void xd60_poker_leds_on(void) { DDRF |= (1<<4); PORTF &= ~(1<<4); } 17inline void xd60_bl_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
18inline void xd60_fn_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
19inline void xd60_esc_led_on(void) { DDRF |= (1<<6); PORTF &= ~(1<<6); }
20inline void xd60_wasd_leds_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
21 18
22inline void xd60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } 19inline void xd60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
23inline void xd60_poker_leds_off(void) { DDRF &= ~(1<<4); PORTF &= ~(1<<4); } 20inline void xd60_bl_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
24inline void xd60_fn_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
25inline void xd60_esc_led_off(void) { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
26inline void xd60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
27 21
28/* XD60 Keymap Definition Macro */ 22/* XD60 Keymap Definition Macro */
29#define KEYMAP( \ 23#define KEYMAP( \
diff --git a/keyboards/xd60/xd60.jpg b/keyboards/xd60/xd60.jpg
new file mode 100644
index 000000000..11654f0fd
--- /dev/null
+++ b/keyboards/xd60/xd60.jpg
Binary files differ