aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbbrfkr <bbrfkr@gmail.com>2021-06-07 14:08:20 +0900
committerGitHub <noreply@github.com>2021-06-06 22:08:20 -0700
commit7b666245d6e6baea939e0088fbbf9104d8efaca1 (patch)
treeab6aa9d8594731bd377aa53faa8d02faa0cae78f
parent23631de1919da3de393d1870d8c9606d1cd4849b (diff)
downloadqmk_firmware-7b666245d6e6baea939e0088fbbf9104d8efaca1.tar.gz
qmk_firmware-7b666245d6e6baea939e0088fbbf9104d8efaca1.zip
[Keyboard] add molecule (#12601)
Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Drashna Jaelre <drashna@live.com>
-rw-r--r--keyboards/molecule/adns.c254
-rw-r--r--keyboards/molecule/adns.h36
-rw-r--r--keyboards/molecule/adns9800_srom_A6.h3081
-rwxr-xr-xkeyboards/molecule/config.h159
-rwxr-xr-xkeyboards/molecule/info.json215
-rwxr-xr-xkeyboards/molecule/keymaps/default/keymap.c39
-rwxr-xr-xkeyboards/molecule/keymaps/default/readme.md1
-rwxr-xr-xkeyboards/molecule/molecule.c17
-rwxr-xr-xkeyboards/molecule/molecule.h40
-rwxr-xr-xkeyboards/molecule/readme.md21
-rwxr-xr-xkeyboards/molecule/rules.mk27
11 files changed, 3890 insertions, 0 deletions
diff --git a/keyboards/molecule/adns.c b/keyboards/molecule/adns.c
new file mode 100644
index 000000000..be40cf7ea
--- /dev/null
+++ b/keyboards/molecule/adns.c
@@ -0,0 +1,254 @@
1/* Copyright 2020 Richard Sutherland <rich@brickbots.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include "spi_master.h"
17#include "adns.h"
18#include "debug.h"
19#include "quantum.h"
20#include "pointing_device.h"
21#include "adns9800_srom_A6.h"
22
23// registers
24#define REG_Product_ID 0x00
25#define REG_Revision_ID 0x01
26#define REG_Motion 0x02
27#define REG_Delta_X_L 0x03
28#define REG_Delta_X_H 0x04
29#define REG_Delta_Y_L 0x05
30#define REG_Delta_Y_H 0x06
31#define REG_SQUAL 0x07
32#define REG_Pixel_Sum 0x08
33#define REG_Maximum_Pixel 0x09
34#define REG_Minimum_Pixel 0x0a
35#define REG_Shutter_Lower 0x0b
36#define REG_Shutter_Upper 0x0c
37#define REG_Frame_Period_Lower 0x0d
38#define REG_Frame_Period_Upper 0x0e
39#define REG_Configuration_I 0x0f
40#define REG_Configuration_II 0x10
41#define REG_Frame_Capture 0x12
42#define REG_SROM_Enable 0x13
43#define REG_Run_Downshift 0x14
44#define REG_Rest1_Rate 0x15
45#define REG_Rest1_Downshift 0x16
46#define REG_Rest2_Rate 0x17
47#define REG_Rest2_Downshift 0x18
48#define REG_Rest3_Rate 0x19
49#define REG_Frame_Period_Max_Bound_Lower 0x1a
50#define REG_Frame_Period_Max_Bound_Upper 0x1b
51#define REG_Frame_Period_Min_Bound_Lower 0x1c
52#define REG_Frame_Period_Min_Bound_Upper 0x1d
53#define REG_Shutter_Max_Bound_Lower 0x1e
54#define REG_Shutter_Max_Bound_Upper 0x1f
55#define REG_LASER_CTRL0 0x20
56#define REG_Observation 0x24
57#define REG_Data_Out_Lower 0x25
58#define REG_Data_Out_Upper 0x26
59#define REG_SROM_ID 0x2a
60#define REG_Lift_Detection_Thr 0x2e
61#define REG_Configuration_V 0x2f
62#define REG_Configuration_IV 0x39
63#define REG_Power_Up_Reset 0x3a
64#define REG_Shutdown 0x3b
65#define REG_Inverse_Product_ID 0x3f
66#define REG_Motion_Burst 0x50
67#define REG_SROM_Load_Burst 0x62
68#define REG_Pixel_Burst 0x64
69
70// pins
71#define NCS F7
72
73extern const uint16_t firmware_length;
74extern const uint8_t firmware_data[];
75
76enum motion_burst_propertr{
77 motion = 0,
78 observation,
79 delta_x_l,
80 delta_x_h,
81 delta_y_l,
82 delta_y_h,
83 squal,
84 pixel_sum,
85 maximum_pixel,
86 minimum_pixel,
87 shutter_upper,
88 shutter_lower,
89 frame_period_upper,
90 frame_period_lower,
91 end_data
92};
93
94void adns_begin(void){
95 spi_start(NCS, false, 3, 8);
96}
97
98void adns_end(void){
99 spi_stop();
100}
101
102void adns_write(uint8_t reg_addr, uint8_t data){
103
104 adns_begin();
105 //send address of the register, with MSBit = 1 to indicate it's a write
106 spi_write(reg_addr | 0x80 );
107 spi_write(data);
108
109 // tSCLK-NCS for write operation
110 wait_us(20);
111
112
113 // tSWW/tSWR (=120us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound
114 wait_us(100);
115 adns_end();
116}
117
118uint8_t adns_read(uint8_t reg_addr){
119
120
121 adns_begin();
122 // send adress of the register, with MSBit = 0 to indicate it's a read
123 spi_write(reg_addr & 0x7f );
124 uint8_t data = spi_read();
125
126 // tSCLK-NCS for read operation is 120ns
127 wait_us(1);
128
129
130 // tSRW/tSRR (=20us) minus tSCLK-NCS
131 wait_us(19);
132
133 adns_end();
134 return data;
135}
136
137void pointing_device_init(void) {
138 dprint("STARTING INTI\n");
139
140 spi_init();
141 // reset serial port
142 adns_begin();
143 adns_end();
144
145 // reboot
146 adns_write(REG_Power_Up_Reset, 0x5a);
147 wait_ms(50);
148 // read registers and discard
149 adns_read(REG_Motion);
150 adns_read(REG_Delta_X_L);
151 adns_read(REG_Delta_X_H);
152 adns_read(REG_Delta_Y_L);
153 adns_read(REG_Delta_Y_H);
154
155 // upload firmware
156
157 // set the configuration_IV register in 3k firmware mode
158 // bit 1 = 1 for 3k mode, other bits are reserved
159 adns_write(REG_Configuration_IV, 0x02);
160
161 // write 0x1d in SROM_enable reg for initializing
162 adns_write(REG_SROM_Enable, 0x1d);
163
164 // wait for more than one frame period
165 // assume that the frame rate is as low as 100fps... even if it should never be that low
166 wait_ms(10);
167
168 // write 0x18 to SROM_enable to start SROM download
169 adns_write(REG_SROM_Enable, 0x18);
170
171 // write the SROM file (=firmware data)
172
173 // write burst destination adress
174 adns_begin();
175 spi_write(REG_SROM_Load_Burst | 0x80);
176 wait_us(15);
177 // send all bytes of the firmware
178 unsigned char c;
179 for(int i = 0; i < firmware_length; i++){
180 c = (unsigned char)pgm_read_byte(firmware_data + i);
181 spi_write(c);
182 wait_us(15);
183 }
184
185 adns_end();
186 wait_ms(10);
187
188 // enable laser(bit 0 = 0b), in normal mode (bits 3,2,1 = 000b)
189 // reading the actual value of the register is important because the real
190 // default value is different from what is said in the datasheet, and if you
191 // change the reserved bytes (like by writing 0x00...) it would not work.
192 uint8_t laser_ctrl0 = adns_read(REG_LASER_CTRL0);
193 adns_write(REG_LASER_CTRL0, laser_ctrl0 & 0xf0);
194
195 wait_ms(1);
196
197 // set the configuration_I register to set the CPI
198 // 0x01 = 50, minimum
199 // 0x44 = 3400, default
200 // 0x8e = 7100
201 // 0xA4 = 8200, maximum
202 adns_write(REG_Configuration_I, 0x10);
203
204 wait_ms(100);
205 dprint("INIT ENDED\n");
206}
207
208int16_t convertDeltaToInt(uint8_t high, uint8_t low){
209
210 // join bytes into twos compliment
211 //int16_t twos_comp = (high << 8) | low;
212 //return twos_comp;
213 return (high << 8) | low;
214}
215
216motion_delta_t readSensor(void) {
217 adns_begin();
218
219 // read from Motion_Burst to enable burt mode
220 spi_write(REG_Motion_Burst & 0x7f);
221
222 // Wait one frame per docs, thanks u/kbjunky
223 wait_us(100);
224 uint8_t burst_data[pixel_sum];
225
226 for (int i = 0; i < pixel_sum; ++i) {
227 burst_data[i] = spi_read();
228 }
229
230 uint16_t delta_x = convertDeltaToInt(burst_data[delta_x_h], burst_data[delta_x_l]);
231 uint16_t delta_y = convertDeltaToInt(burst_data[delta_y_h], burst_data[delta_y_l]);
232 // Only consider the MSB for motion as this byte has other status bits
233 uint8_t motion_ind = burst_data[motion] & 0b10000000;
234 adns_end();
235
236 motion_delta_t delta = {delta_x, delta_y, motion_ind};
237 return delta;
238}
239
240void pointing_device_task(void) {
241 motion_delta_t delta = readSensor();
242
243 report_mouse_t report = pointing_device_get_report();
244
245 if(delta.motion_ind) {
246 // clamp deltas from -127 to 127
247 report.x = delta.delta_x < -127 ? -127 : delta.delta_x > 127 ? 127 : delta.delta_x;
248 report.x = -report.x;
249 report.y = delta.delta_y < -127 ? -127 : delta.delta_y > 127 ? 127 : delta.delta_y;
250 }
251
252 pointing_device_set_report(report);
253 pointing_device_send();
254}
diff --git a/keyboards/molecule/adns.h b/keyboards/molecule/adns.h
new file mode 100644
index 000000000..d684d3cbc
--- /dev/null
+++ b/keyboards/molecule/adns.h
@@ -0,0 +1,36 @@
1/* Copyright 2020 Richard Sutherland <rich@brickbots.com>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#pragma once
17
18void adns_begin(void);
19
20void adns_end(void);
21
22void adns_write(uint8_t reg_addr, uint8_t data);
23
24uint8_t adns_read(uint8_t reg_addr);
25
26
27int16_t convertDeltaToInt(uint8_t high, uint8_t low);
28
29struct _motion_delta {
30 int16_t delta_x;
31 int16_t delta_y;
32 int8_t motion_ind;
33};
34typedef struct _motion_delta motion_delta_t;
35
36motion_delta_t readSensor(void);
diff --git a/keyboards/molecule/adns9800_srom_A6.h b/keyboards/molecule/adns9800_srom_A6.h
new file mode 100644
index 000000000..fddf30589
--- /dev/null
+++ b/keyboards/molecule/adns9800_srom_A6.h
@@ -0,0 +1,3081 @@
1// ADNS-9800 Firmware bytecode is Copyright Avago Technologies.
2// Originally formatted for Arduino use by MrJohnK - https://github.com/mrjohnk
3
4#pragma once
5
6#include "progmem.h"
7
8const uint16_t firmware_length = 3070;
9
10const uint8_t firmware_data[] PROGMEM = {
11 0x03,
120xa6,
130x68,
140x1e,
150x7d,
160x10,
170x7e,
180x7e,
190x5f,
200x1c,
210xb8,
220xf2,
230x47,
240x0c,
250x7b,
260x74,
270x4b,
280x14,
290x8b,
300x75,
310x66,
320x51,
330x0b,
340x8c,
350x76,
360x74,
370x4b,
380x14,
390xaa,
400xd6,
410x0f,
420x9c,
430xba,
440xf6,
450x6e,
460x3f,
470xdd,
480x38,
490xd5,
500x02,
510x80,
520x9b,
530x82,
540x6d,
550x58,
560x13,
570xa4,
580xab,
590xb5,
600xc9,
610x10,
620xa2,
630xc6,
640x0a,
650x7f,
660x5d,
670x19,
680x91,
690xa0,
700xa3,
710xce,
720xeb,
730x3e,
740xc9,
750xf1,
760x60,
770x42,
780xe7,
790x4c,
800xfb,
810x74,
820x6a,
830x56,
840x2e,
850xbf,
860xdd,
870x38,
880xd3,
890x05,
900x88,
910x92,
920xa6,
930xce,
940xff,
950x5d,
960x38,
970xd1,
980xcf,
990xef,
1000x58,
1010xcb,
1020x65,
1030x48,
1040xf0,
1050x35,
1060x85,
1070xa9,
1080xb2,
1090x8f,
1100x5e,
1110xf3,
1120x80,
1130x94,
1140x97,
1150x7e,
1160x75,
1170x97,
1180x87,
1190x73,
1200x13,
1210xb0,
1220x8a,
1230x69,
1240xd4,
1250x0a,
1260xde,
1270xc1,
1280x79,
1290x59,
1300x36,
1310xdb,
1320x9d,
1330xd6,
1340xb8,
1350x15,
1360x6f,
1370xce,
1380x3c,
1390x72,
1400x32,
1410x45,
1420x88,
1430xdf,
1440x6c,
1450xa5,
1460x6d,
1470xe8,
1480x76,
1490x96,
1500x14,
1510x74,
1520x20,
1530xdc,
1540xf4,
1550xfa,
1560x37,
1570x6a,
1580x27,
1590x32,
1600xe3,
1610x29,
1620xbf,
1630xc4,
1640xc7,
1650x06,
1660x9d,
1670x58,
1680xe7,
1690x87,
1700x7c,
1710x2e,
1720x9f,
1730x6e,
1740x49,
1750x07,
1760x5d,
1770x23,
1780x64,
1790x54,
1800x83,
1810x6e,
1820xcb,
1830xb7,
1840x77,
1850xf7,
1860x2b,
1870x6e,
1880x0f,
1890x2e,
1900x66,
1910x12,
1920x60,
1930x55,
1940x65,
1950xfc,
1960x43,
1970xb3,
1980x58,
1990x73,
2000x5b,
2010xe8,
2020x67,
2030x04,
2040x43,
2050x02,
2060xde,
2070xb3,
2080x89,
2090xa0,
2100x6d,
2110x3a,
2120x27,
2130x79,
2140x64,
2150x5b,
2160x0c,
2170x16,
2180x9e,
2190x66,
2200xb1,
2210x8b,
2220x87,
2230x0c,
2240x5d,
2250xf2,
2260xb6,
2270x3d,
2280x71,
2290xdf,
2300x42,
2310x03,
2320x8a,
2330x06,
2340x8d,
2350xef,
2360x1d,
2370xa8,
2380x96,
2390x5c,
2400xed,
2410x31,
2420x61,
2430x5c,
2440xa1,
2450x34,
2460xf6,
2470x8c,
2480x08,
2490x60,
2500x33,
2510x07,
2520x00,
2530x3e,
2540x79,
2550x95,
2560x1b,
2570x43,
2580x7f,
2590xfe,
2600xb6,
2610xa6,
2620xd4,
2630x9d,
2640x76,
2650x72,
2660xbf,
2670xad,
2680xc0,
2690x15,
2700xe8,
2710x37,
2720x31,
2730xa3,
2740x72,
2750x63,
2760x52,
2770x1d,
2780x1c,
2790x5d,
2800x51,
2810x1b,
2820xe1,
2830xa9,
2840xed,
2850x60,
2860x32,
2870x3e,
2880xa9,
2890x50,
2900x28,
2910x53,
2920x06,
2930x59,
2940xe2,
2950xfc,
2960xe7,
2970x02,
2980x64,
2990x39,
3000x21,
3010x56,
3020x4a,
3030xa5,
3040x40,
3050x80,
3060x81,
3070xd5,
3080x5a,
3090x60,
3100x7b,
3110x68,
3120x84,
3130xf1,
3140xe0,
3150xb1,
3160xb6,
3170x5b,
3180xdf,
3190xa8,
3200x1d,
3210x6d,
3220x65,
3230x20,
3240xc0,
3250xa2,
3260xb9,
3270xd9,
3280xbb,
3290x00,
3300xa6,
3310xdb,
3320x8b,
3330x01,
3340x53,
3350x91,
3360xfe,
3370xc4,
3380x51,
3390x85,
3400xb0,
3410x96,
3420x7f,
3430xfd,
3440x51,
3450xdd,
3460x14,
3470x03,
3480x67,
3490x2e,
3500x75,
3510x1c,
3520x76,
3530xd3,
3540x6e,
3550xdd,
3560x99,
3570x55,
3580x76,
3590xe5,
3600xab,
3610x23,
3620xfc,
3630x4a,
3640xd5,
3650xc6,
3660xe8,
3670x2e,
3680xca,
3690x8a,
3700xb3,
3710xf6,
3720x8c,
3730x6c,
3740xb0,
3750xe9,
3760xf2,
3770xe7,
3780x9e,
3790x69,
3800x41,
3810xed,
3820xf1,
3830x6d,
3840xd2,
3850x86,
3860xd8,
3870x7e,
3880xcb,
3890x5d,
3900x47,
3910x6c,
3920x85,
3930x6a,
3940x23,
3950xed,
3960x20,
3970x40,
3980x93,
3990xb4,
4000x20,
4010xc7,
4020xa5,
4030xc9,
4040xaf,
4050x03,
4060x15,
4070xac,
4080x19,
4090xe5,
4100x2a,
4110x36,
4120xdf,
4130x6d,
4140xc5,
4150x8c,
4160x80,
4170x07,
4180xce,
4190x92,
4200x0c,
4210xd8,
4220x06,
4230x62,
4240x0f,
4250xdd,
4260x48,
4270x46,
4280x1a,
4290x53,
4300xc7,
4310x8a,
4320x8c,
4330x5d,
4340x5d,
4350xb4,
4360xa1,
4370x02,
4380xd3,
4390xa9,
4400xb8,
4410xf3,
4420x94,
4430x8f,
4440x3f,
4450xe5,
4460x54,
4470xd4,
4480x11,
4490x65,
4500xb2,
4510x5e,
4520x09,
4530x0b,
4540x81,
4550xe3,
4560x75,
4570xa7,
4580x89,
4590x81,
4600x39,
4610x6c,
4620x46,
4630xf6,
4640x06,
4650x9f,
4660x27,
4670x3b,
4680xb6,
4690x2d,
4700x5f,
4710x1d,
4720x4b,
4730xd4,
4740x7b,
4750x1d,
4760x61,
4770x74,
4780x89,
4790xe4,
4800xe3,
4810xbd,
4820x98,
4830x1b,
4840xc4,
4850x51,
4860x3b,
4870xa4,
4880xfa,
4890xe0,
4900x92,
4910xf7,
4920xbe,
4930xf2,
4940x4d,
4950xbb,
4960xff,
4970xad,
4980x4f,
4990x6d,
5000x68,
5010xc2,
5020x79,
5030x40,
5040xaa,
5050x9b,
5060x8f,
5070x0c,
5080x32,
5090x4b,
5100x5f,
5110x3e,
5120xab,
5130x59,
5140x98,
5150xb3,
5160xf5,
5170x1d,
5180xac,
5190x5e,
5200xbc,
5210x78,
5220xd3,
5230x01,
5240x6c,
5250x64,
5260x15,
5270x2f,
5280xd8,
5290x71,
5300xa6,
5310x2d,
5320x45,
5330xe1,
5340x22,
5350x42,
5360xe4,
5370x4e,
5380x04,
5390x3c,
5400x7d,
5410xf4,
5420x40,
5430x21,
5440xb4,
5450x67,
5460x05,
5470xa8,
5480xe2,
5490xf3,
5500x72,
5510x87,
5520x4c,
5530x7d,
5540xd9,
5550x1b,
5560x65,
5570x97,
5580xf3,
5590xc2,
5600xe3,
5610xe4,
5620xc8,
5630xd2,
5640xde,
5650xf6,
5660xef,
5670xdc,
5680xbb,
5690x44,
5700x08,
5710x5e,
5720xe2,
5730x45,
5740x27,
5750x01,
5760xb0,
5770xf6,
5780x43,
5790xe7,
5800x3a,
5810xf6,
5820xdc,
5830x9d,
5840xed,
5850xf3,
5860xc5,
5870x0c,
5880xb8,
5890x9c,
5900x98,
5910x3a,
5920xd8,
5930x36,
5940xee,
5950x96,
5960x72,
5970x67,
5980xe7,
5990x81,
6000x91,
6010xd5,
6020x05,
6030x0a,
6040xe0,
6050x82,
6060xd5,
6070x8f,
6080xe8,
6090xf9,
6100xb0,
6110xc9,
6120xcf,
6130x93,
6140xe7,
6150x04,
6160xc5,
6170xbc,
6180x2b,
6190x43,
6200x56,
6210x7e,
6220xe8,
6230x67,
6240x7c,
6250xe5,
6260xfb,
6270x49,
6280xad,
6290x5e,
6300x9f,
6310x25,
6320x13,
6330xde,
6340x6e,
6350x6e,
6360xe9,
6370xf1,
6380xec,
6390x87,
6400x0b,
6410x59,
6420x81,
6430x76,
6440x84,
6450x76,
6460xb3,
6470x24,
6480xaf,
6490x30,
6500xfd,
6510x27,
6520x8b,
6530xab,
6540xd8,
6550x00,
6560x8b,
6570x9b,
6580x0c,
6590xd2,
6600xb2,
6610x4e,
6620x5e,
6630x9d,
6640x1d,
6650x96,
6660x01,
6670x00,
6680x67,
6690xc1,
6700x5f,
6710x02,
6720x20,
6730xfd,
6740x45,
6750x6a,
6760x01,
6770x60,
6780x58,
6790x45,
6800xca,
6810x47,
6820x21,
6830x90,
6840x5a,
6850xc4,
6860x43,
6870x26,
6880x1a,
6890xd7,
6900xa5,
6910x4a,
6920xb2,
6930x5d,
6940x2b,
6950x35,
6960x49,
6970xfb,
6980xa5,
6990x17,
7000x92,
7010x21,
7020x1e,
7030x93,
7040x96,
7050x67,
7060xa2,
7070x7e,
7080x36,
7090x7a,
7100xde,
7110x5f,
7120xbe,
7130x7a,
7140x58,
7150x9d,
7160xf8,
7170x78,
7180xa3,
7190xfa,
7200xc8,
7210xd5,
7220x17,
7230xf0,
7240x21,
7250x97,
7260x8c,
7270x80,
7280xb5,
7290x4b,
7300x3b,
7310xbd,
7320xbb,
7330x41,
7340x21,
7350xa8,
7360x50,
7370x67,
7380xf7,
7390xe7,
7400x19,
7410x80,
7420x10,
7430x8e,
7440xce,
7450x04,
7460x18,
7470x3f,
7480x51,
7490x6b,
7500x77,
7510xd8,
7520x9e,
7530x16,
7540xaf,
7550xec,
7560xef,
7570x48,
7580x16,
7590x4d,
7600x9e,
7610x85,
7620x38,
7630x18,
7640x3e,
7650xd4,
7660x28,
7670x87,
7680x60,
7690x2a,
7700xf6,
7710x7f,
7720x09,
7730x86,
7740x6f,
7750x9c,
7760x3c,
7770x3a,
7780xff,
7790xab,
7800xd0,
7810x61,
7820xa2,
7830x97,
7840x0d,
7850x71,
7860x94,
7870x7e,
7880xfd,
7890xb9,
7900x80,
7910x02,
7920x89,
7930x6a,
7940xb3,
7950x84,
7960x6c,
7970x2a,
7980x77,
7990x62,
8000xbe,
8010x0b,
8020xf4,
8030xaf,
8040xac,
8050x7b,
8060x7c,
8070x8e,
8080xca,
8090x01,
8100xba,
8110x71,
8120x78,
8130x94,
8140xfd,
8150xb5,
8160x39,
8170xa4,
8180x4d,
8190x2f,
8200x78,
8210xcf,
8220xca,
8230x92,
8240x0c,
8250x1a,
8260x99,
8270x48,
8280x4c,
8290x11,
8300x96,
8310xb5,
8320x4e,
8330x41,
8340x28,
8350xe4,
8360xa6,
8370xfe,
8380x4b,
8390x72,
8400x91,
8410xe7,
8420xd4,
8430xdd,
8440x9f,
8450x12,
8460xe6,
8470x29,
8480x38,
8490xce,
8500x45,
8510xae,
8520x02,
8530xb8,
8540x24,
8550xae,
8560xbd,
8570xe9,
8580x66,
8590x08,
8600x62,
8610xa2,
8620x2c,
8630x2b,
8640x00,
8650xe2,
8660x23,
8670xd9,
8680xc4,
8690x48,
8700xe4,
8710xd3,
8720xac,
8730xbb,
8740x34,
8750xc7,
8760xf0,
8770xe3,
8780x4f,
8790xb9,
8800x30,
8810xea,
8820xa2,
8830x12,
8840xf1,
8850x30,
8860x2c,
8870x36,
8880xde,
8890x48,
8900xf2,
8910xb0,
8920x4c,
8930x43,
8940x3f,
8950x2e,
8960x58,
8970xe4,
8980x20,
8990xe3,
9000x58,
9010xcd,
9020x31,
9030x22,
9040xf0,
9050xa2,
9060x2a,
9070xe6,
9080x19,
9090x90,
9100x55,
9110x86,
9120xf6,
9130x55,
9140x79,
9150xd1,
9160xd7,
9170x46,
9180x2f,
9190xc0,
9200xdc,
9210x99,
9220xe8,
9230xf3,
9240x6a,
9250xdf,
9260x7f,
9270xeb,
9280x24,
9290x4a,
9300x1e,
9310x5a,
9320x75,
9330xde,
9340x2f,
9350x5c,
9360x19,
9370x61,
9380x03,
9390x53,
9400x54,
9410x6a,
9420x3b,
9430x18,
9440x70,
9450xb6,
9460x4f,
9470xf1,
9480x9c,
9490x0a,
9500x59,
9510x9d,
9520x19,
9530x92,
9540x65,
9550x8c,
9560x83,
9570x14,
9580x2d,
9590x44,
9600x8a,
9610x75,
9620xa9,
9630xf5,
9640x90,
9650xd2,
9660x66,
9670x4e,
9680xfa,
9690x69,
9700x0f,
9710x5b,
9720x0b,
9730x98,
9740x65,
9750xc8,
9760x11,
9770x42,
9780x59,
9790x7f,
9800xdd,
9810x1b,
9820x75,
9830x17,
9840x31,
9850x4c,
9860x75,
9870x58,
9880xeb,
9890x58,
9900x63,
9910x7d,
9920xf2,
9930xa6,
9940xc2,
9950x6e,
9960xb7,
9970x3f,
9980x3e,
9990x5e,
10000x47,
10010xad,
10020xb7,
10030x04,
10040xe8,
10050x05,
10060xf8,
10070xb2,
10080xcf,
10090x19,
10100xf3,
10110xd2,
10120x85,
10130xfe,
10140x3e,
10150x3e,
10160xb1,
10170x62,
10180x08,
10190x2c,
10200x10,
10210x07,
10220x0d,
10230x73,
10240x90,
10250x17,
10260xfa,
10270x9b,
10280x56,
10290x02,
10300x75,
10310xf9,
10320x51,
10330xe0,
10340xe9,
10350x1a,
10360x7b,
10370x9f,
10380xb3,
10390xf3,
10400x98,
10410xb8,
10420x1c,
10430x9c,
10440xe1,
10450xd5,
10460x35,
10470xae,
10480xc8,
10490x60,
10500x48,
10510x11,
10520x09,
10530x94,
10540x6b,
10550xd0,
10560x8b,
10570x15,
10580xbc,
10590x05,
10600x68,
10610xd3,
10620x54,
10630x8a,
10640x51,
10650x39,
10660x5c,
10670x42,
10680x76,
10690xce,
10700xd8,
10710xad,
10720x89,
10730x30,
10740xc9,
10750x05,
10760x1c,
10770xcc,
10780x94,
10790x3f,
10800x0f,
10810x90,
10820x6f,
10830x72,
10840x2d,
10850x85,
10860x64,
10870x9a,
10880xb9,
10890x23,
10900xf9,
10910x0b,
10920xc3,
10930x7c,
10940x39,
10950x0f,
10960x97,
10970x07,
10980x97,
10990xda,
11000x58,
11010x48,
11020x33,
11030x05,
11040x23,
11050xb8,
11060x82,
11070xe8,
11080xd3,
11090x53,
11100x89,
11110xaf,
11120x33,
11130x80,
11140x22,
11150x84,
11160x0c,
11170x95,
11180x5c,
11190x67,
11200xb8,
11210x77,
11220x0c,
11230x5c,
11240xa2,
11250x5f,
11260x3d,
11270x58,
11280x0f,
11290x27,
11300xf3,
11310x2f,
11320xae,
11330x48,
11340xbd,
11350x0b,
11360x6f,
11370x54,
11380xfb,
11390x67,
11400x4c,
11410xea,
11420x32,
11430x27,
11440xf1,
11450xfa,
11460xe2,
11470xb0,
11480xec,
11490x0b,
11500x15,
11510xb4,
11520x70,
11530xf6,
11540x5c,
11550xdd,
11560x71,
11570x60,
11580xc3,
11590xc1,
11600xa8,
11610x32,
11620x65,
11630xac,
11640x7a,
11650x77,
11660x41,
11670xe5,
11680xa9,
11690x6b,
11700x11,
11710x81,
11720xfa,
11730x34,
11740x8d,
11750xfb,
11760xc1,
11770x80,
11780x6e,
11790xc4,
11800x60,
11810x30,
11820x07,
11830xd4,
11840x8b,
11850x67,
11860xbd,
11870xaa,
11880x8c,
11890x9c,
11900x64,
11910xac,
11920xdb,
11930x0b,
11940x24,
11950x8b,
11960x63,
11970x6f,
11980xe6,
11990xbc,
12000xe7,
12010x33,
12020xa4,
12030x4a,
12040x4c,
12050xa7,
12060x9f,
12070x43,
12080x53,
12090xd2,
12100xbb,
12110x8f,
12120x43,
12130xc7,
12140x3d,
12150x78,
12160x68,
12170x3f,
12180xa5,
12190x3d,
12200xca,
12210x69,
12220x84,
12230xa6,
12240x97,
12250x2d,
12260xc0,
12270x7d,
12280x31,
12290x34,
12300x55,
12310x1d,
12320x07,
12330xb1,
12340x5f,
12350x40,
12360x5c,
12370x93,
12380xb0,
12390xbc,
12400x7c,
12410xb0,
12420xbc,
12430xe7,
12440x12,
12450xee,
12460x6b,
12470x2b,
12480xd3,
12490x4d,
12500x67,
12510x70,
12520x3a,
12530x9a,
12540xf2,
12550x3c,
12560x7c,
12570x81,
12580xfa,
12590xd7,
12600xd9,
12610x90,
12620x91,
12630x81,
12640xb8,
12650xb1,
12660xf3,
12670x48,
12680x6a,
12690x26,
12700x4f,
12710x0c,
12720xce,
12730xb0,
12740x9e,
12750xfd,
12760x4a,
12770x3a,
12780xaf,
12790xac,
12800x5b,
12810x3f,
12820xbf,
12830x44,
12840x5a,
12850xa3,
12860x19,
12870x1e,
12880x4b,
12890xe7,
12900x36,
12910x6a,
12920xd7,
12930x20,
12940xae,
12950xd7,
12960x7d,
12970x3b,
12980xe7,
12990xff,
13000x3a,
13010x86,
13020x2e,
13030xd0,
13040x4a,
13050x3e,
13060xaf,
13070x9f,
13080x8e,
13090x01,
13100xbf,
13110xf8,
13120x4f,
13130xc1,
13140xe8,
13150x6f,
13160x74,
13170xe1,
13180x45,
13190xd3,
13200xf7,
13210x04,
13220x6a,
13230x4b,
13240x9d,
13250xec,
13260x33,
13270x27,
13280x76,
13290xd7,
13300xc5,
13310xe1,
13320xb0,
13330x3b,
13340x0e,
13350x23,
13360xec,
13370xf0,
13380x86,
13390xd2,
13400x1a,
13410xbf,
13420x3d,
13430x04,
13440x62,
13450xb3,
13460x6c,
13470xb2,
13480xeb,
13490x17,
13500x05,
13510xa6,
13520x0a,
13530x8a,
13540x7e,
13550x83,
13560x1c,
13570xb6,
13580x37,
13590x09,
13600xc6,
13610x0b,
13620x70,
13630x3c,
13640xb5,
13650x93,
13660x81,
13670xd8,
13680x93,
13690xa0,
13700x5f,
13710x1e,
13720x08,
13730xe2,
13740xc6,
13750xe5,
13760xc9,
13770x72,
13780xf1,
13790xf1,
13800xc1,
13810xed,
13820xd5,
13830x58,
13840x93,
13850x83,
13860xf8,
13870x65,
13880x67,
13890x2e,
13900x0d,
13910xa9,
13920xf1,
13930x64,
13940x12,
13950xe6,
13960x4c,
13970xea,
13980x15,
13990x3f,
14000x8c,
14010x1a,
14020xb6,
14030xbf,
14040xf6,
14050xb9,
14060x52,
14070x35,
14080x09,
14090xb0,
14100xe6,
14110xf7,
14120xcd,
14130xf1,
14140xa5,
14150xaa,
14160x81,
14170xd1,
14180x81,
14190x6f,
14200xb4,
14210xa9,
14220x66,
14230x1f,
14240xfc,
14250x48,
14260xc0,
14270xb6,
14280xd1,
14290x8b,
14300x06,
14310x2f,
14320xf6,
14330xef,
14340x1f,
14350x0a,
14360xe6,
14370xce,
14380x3a,
14390x4a,
14400x55,
14410xbf,
14420x6d,
14430xf9,
14440x4d,
14450xd4,
14460x08,
14470x45,
14480x4b,
14490xc3,
14500x66,
14510x19,
14520x92,
14530x10,
14540xe1,
14550x17,
14560x8e,
14570x28,
14580x91,
14590x16,
14600xbf,
14610x3c,
14620xee,
14630xa3,
14640xa6,
14650x99,
14660x92,
14670x10,
14680xe1,
14690xf6,
14700xcc,
14710xac,
14720xb8,
14730x65,
14740x0b,
14750x43,
14760x66,
14770xf8,
14780xe3,
14790xe5,
14800x3f,
14810x24,
14820x89,
14830x47,
14840x5d,
14850x78,
14860x43,
14870xd0,
14880x61,
14890x17,
14900xbd,
14910x5b,
14920x64,
14930x54,
14940x08,
14950x45,
14960x59,
14970x93,
14980xf6,
14990x95,
15000x8a,
15010x41,
15020x51,
15030x62,
15040x4b,
15050x51,
15060x02,
15070x30,
15080x73,
15090xc7,
15100x87,
15110xc5,
15120x4b,
15130xa2,
15140x97,
15150x0f,
15160xe8,
15170x46,
15180x5f,
15190x7e,
15200x2a,
15210xe1,
15220x30,
15230x20,
15240xb0,
15250xfa,
15260xe7,
15270xce,
15280x61,
15290x42,
15300x57,
15310x6e,
15320x21,
15330xf3,
15340x7a,
15350xec,
15360xe3,
15370x25,
15380xc7,
15390x25,
15400xf3,
15410x67,
15420xa7,
15430x57,
15440x40,
15450x00,
15460x02,
15470xcf,
15480x1c,
15490x80,
15500x77,
15510x67,
15520xbd,
15530x70,
15540xa1,
15550x19,
15560x92,
15570x31,
15580x75,
15590x93,
15600x27,
15610x27,
15620xb6,
15630x82,
15640xe4,
15650xeb,
15660x1d,
15670x78,
15680x48,
15690xe7,
15700xa5,
15710x5e,
15720x57,
15730xef,
15740x64,
15750x28,
15760x64,
15770x1b,
15780xf6,
15790x11,
15800xb2,
15810x03,
15820x9d,
15830xb9,
15840x18,
15850x02,
15860x27,
15870xf7,
15880xbe,
15890x9d,
15900x55,
15910xfc,
15920x00,
15930xd2,
15940xc7,
15950xae,
15960xad,
15970x0b,
15980xc5,
15990xe9,
16000x42,
16010x41,
16020x48,
16030xd8,
16040x32,
16050xcf,
16060xf6,
16070x0f,
16080xf5,
16090xbc,
16100x97,
16110xc6,
16120x99,
16130x47,
16140x76,
16150xbd,
16160x89,
16170x06,
16180x0f,
16190x63,
16200x0c,
16210x51,
16220xd4,
16230x5e,
16240xea,
16250x48,
16260xa8,
16270xa2,
16280x56,
16290x1c,
16300x79,
16310x84,
16320x86,
16330x40,
16340x88,
16350x41,
16360x76,
16370x55,
16380xfc,
16390xc2,
16400xd7,
16410xfd,
16420xc9,
16430xc7,
16440x80,
16450x61,
16460x35,
16470xa7,
16480x43,
16490x20,
16500xf7,
16510xeb,
16520x6c,
16530x66,
16540x13,
16550xb0,
16560xec,
16570x02,
16580x75,
16590x3e,
16600x4b,
16610xaf,
16620xb9,
16630x5d,
16640x40,
16650xda,
16660xd6,
16670x6e,
16680x2d,
16690x39,
16700x54,
16710xc2,
16720x95,
16730x35,
16740x54,
16750x25,
16760x72,
16770xe1,
16780x78,
16790xb8,
16800xeb,
16810xc1,
16820x16,
16830x58,
16840x0f,
16850x9c,
16860x9b,
16870xb4,
16880xea,
16890x37,
16900xec,
16910x3b,
16920x11,
16930xba,
16940xd5,
16950x8a,
16960xa9,
16970xe3,
16980x98,
16990x00,
17000x51,
17010x1c,
17020x14,
17030xe0,
17040x40,
17050x96,
17060xe5,
17070xe9,
17080xf2,
17090x21,
17100x22,
17110xb1,
17120x23,
17130x60,
17140x78,
17150xd3,
17160x17,
17170xf8,
17180x7a,
17190xa5,
17200xa8,
17210xba,
17220x20,
17230xd3,
17240x15,
17250x1e,
17260x32,
17270xe4,
17280x5e,
17290x15,
17300x48,
17310xae,
17320xa9,
17330xe5,
17340xb8,
17350x33,
17360xec,
17370xe8,
17380xa2,
17390x42,
17400xac,
17410xbf,
17420x10,
17430x84,
17440x53,
17450x87,
17460x19,
17470xb4,
17480x5f,
17490x76,
17500x4d,
17510x01,
17520x9d,
17530x56,
17540x74,
17550xd9,
17560x5c,
17570x97,
17580xe7,
17590x88,
17600xea,
17610x3a,
17620xbf,
17630xdc,
17640x4c,
17650x33,
17660x8a,
17670x16,
17680xb9,
17690x5b,
17700xfa,
17710xd8,
17720x42,
17730xa7,
17740xbb,
17750x3c,
17760x04,
17770x27,
17780x78,
17790x49,
17800x81,
17810x2a,
17820x5a,
17830x7d,
17840x7c,
17850x23,
17860xa8,
17870xba,
17880xf7,
17890x9a,
17900x9f,
17910xd2,
17920x66,
17930x3e,
17940x38,
17950x3c,
17960x75,
17970xf9,
17980xd1,
17990x30,
18000x26,
18010x30,
18020x6e,
18030x5a,
18040x6e,
18050xdc,
18060x6a,
18070x69,
18080x32,
18090x50,
18100x33,
18110x47,
18120x9e,
18130xa4,
18140xa8,
18150x64,
18160x66,
18170xf0,
18180x8a,
18190xe4,
18200xfd,
18210x27,
18220x6f,
18230x51,
18240x25,
18250x8b,
18260x43,
18270x74,
18280xc9,
18290x8e,
18300xbd,
18310x88,
18320x31,
18330xbe,
18340xec,
18350x65,
18360xd2,
18370xcb,
18380x8d,
18390x5a,
18400x13,
18410x48,
18420x16,
18430x8c,
18440x61,
18450x0b,
18460x11,
18470xf6,
18480xc6,
18490x66,
18500xae,
18510xc3,
18520xcc,
18530x0c,
18540xd2,
18550xe1,
18560x9f,
18570x82,
18580x41,
18590x3f,
18600x56,
18610xf9,
18620x73,
18630xef,
18640xdc,
18650x30,
18660x50,
18670xcf,
18680xb6,
18690x7f,
18700xbc,
18710xd0,
18720xb3,
18730x10,
18740xab,
18750x24,
18760xe4,
18770xec,
18780xad,
18790x18,
18800x8c,
18810x39,
18820x2d,
18830x30,
18840x4c,
18850xc5,
18860x40,
18870x0d,
18880xf6,
18890xac,
18900xd6,
18910x18,
18920x5d,
18930x96,
18940xbf,
18950x5f,
18960x71,
18970x75,
18980x96,
18990x22,
19000x97,
19010x0f,
19020x02,
19030x94,
19040x6e,
19050xa6,
19060xae,
19070x6d,
19080x8f,
19090x1e,
19100xca,
19110x12,
19120x9b,
19130x2a,
19140x1c,
19150xce,
19160xa9,
19170xee,
19180xfd,
19190x12,
19200x8e,
19210xfc,
19220xed,
19230x09,
19240x33,
19250xba,
19260xf4,
19270x1a,
19280x15,
19290xf6,
19300x9d,
19310x87,
19320x16,
19330x43,
19340x7c,
19350x78,
19360x57,
19370xe1,
19380x44,
19390xc9,
19400xeb,
19410x1f,
19420x58,
19430x4d,
19440xc1,
19450x49,
19460x11,
19470x5c,
19480xb2,
19490x11,
19500xa8,
19510x55,
19520x16,
19530xf1,
19540xc6,
19550x50,
19560xe9,
19570x87,
19580x89,
19590xf6,
19600xcf,
19610xd8,
19620x9c,
19630x51,
19640xa7,
19650xbc,
19660x5b,
19670x31,
19680x6d,
19690x4d,
19700x51,
19710xd0,
19720x4c,
19730xbc,
19740x0d,
19750x58,
19760x2d,
19770x7b,
19780x88,
19790x7a,
19800xf9,
19810x8e,
19820xd6,
19830x40,
19840x4d,
19850xbb,
19860xbe,
19870xc4,
19880xe5,
19890x07,
19900xfc,
19910xd9,
19920x7b,
19930x6d,
19940xa6,
19950x42,
19960x57,
19970x8f,
19980x02,
19990x94,
20000x4f,
20010xe4,
20020x2a,
20030x65,
20040xe2,
20050x19,
20060x5a,
20070x50,
20080xe1,
20090x25,
20100x65,
20110x4a,
20120x60,
20130xc2,
20140xcd,
20150xa8,
20160xec,
20170x05,
20180x2e,
20190x87,
20200x7b,
20210x95,
20220xb7,
20230x4f,
20240xa0,
20250x0b,
20260x1b,
20270x4a,
20280x7f,
20290x92,
20300xc8,
20310x90,
20320xee,
20330x89,
20340x1e,
20350x10,
20360xd2,
20370x85,
20380xe4,
20390x9f,
20400x63,
20410xc8,
20420x12,
20430xbb,
20440x4e,
20450xb8,
20460xcf,
20470x0a,
20480xec,
20490x18,
20500x4e,
20510xe6,
20520x7c,
20530xb3,
20540x33,
20550x26,
20560xc7,
20570x1f,
20580xd2,
20590x04,
20600x23,
20610xea,
20620x07,
20630x0c,
20640x5f,
20650x90,
20660xbd,
20670xa7,
20680x6a,
20690x0f,
20700x4a,
20710xd6,
20720x10,
20730x01,
20740x3c,
20750x12,
20760x29,
20770x2e,
20780x96,
20790xc0,
20800x4d,
20810xbb,
20820xbe,
20830xe5,
20840xa7,
20850x83,
20860xd5,
20870x6a,
20880x3c,
20890xe3,
20900x5b,
20910xb8,
20920xf2,
20930x5c,
20940x6d,
20950x1f,
20960xa6,
20970xf3,
20980x12,
20990x24,
21000xf6,
21010xd6,
21020x3b,
21030x10,
21040x14,
21050x09,
21060x07,
21070x82,
21080xe8,
21090x30,
21100x6a,
21110x99,
21120xdc,
21130x95,
21140x01,
21150x9c,
21160xd4,
21170x68,
21180x3b,
21190xca,
21200x98,
21210x12,
21220xab,
21230x77,
21240x25,
21250x15,
21260x7d,
21270x10,
21280x32,
21290x45,
21300x98,
21310xcd,
21320x7a,
21330xdf,
21340x71,
21350x8a,
21360x75,
21370xc1,
21380x1c,
21390xd4,
21400x68,
21410x25,
21420xeb,
21430xbb,
21440x54,
21450x27,
21460x6f,
21470x2a,
21480xf7,
21490xb9,
21500x98,
21510x03,
21520x27,
21530xde,
21540x24,
21550xa8,
21560xbb,
21570x98,
21580xc2,
21590x84,
21600xff,
21610x9b,
21620x51,
21630xd8,
21640x53,
21650x50,
21660xda,
21670xf5,
21680x88,
21690xaa,
21700x87,
21710x2f,
21720xae,
21730xd6,
21740xea,
21750x6b,
21760xde,
21770xc8,
21780xd7,
21790xa7,
21800x28,
21810x65,
21820x81,
21830xe8,
21840xb2,
21850x3b,
21860x1d,
21870x4f,
21880x75,
21890x8f,
21900x9f,
21910x7a,
21920x74,
21930x8e,
21940xc1,
21950x5f,
21960x9a,
21970xa8,
21980x9d,
21990xfa,
22000x03,
22010xa3,
22020x71,
22030x9b,
22040x37,
22050x6d,
22060xd5,
22070x0b,
22080xf5,
22090xe1,
22100xa1,
22110x1b,
22120x01,
22130x6a,
22140xc6,
22150x67,
22160xaa,
22170xea,
22180x2c,
22190x9d,
22200xa4,
22210xd2,
22220x6e,
22230xfc,
22240xde,
22250x2e,
22260x7f,
22270x94,
22280x69,
22290xe5,
22300x4a,
22310xe0,
22320x01,
22330x48,
22340x3c,
22350x6b,
22360xf7,
22370x1e,
22380xb6,
22390x0b,
22400x5f,
22410xf9,
22420x2e,
22430x07,
22440xc5,
22450xe8,
22460xae,
22470x37,
22480x1b,
22490xbc,
22500x3c,
22510xd8,
22520xd5,
22530x0b,
22540x91,
22550x9e,
22560x80,
22570x24,
22580xf5,
22590x06,
22600x0c,
22610x0e,
22620x98,
22630x07,
22640x96,
22650x2d,
22660x19,
22670xdc,
22680x58,
22690x93,
22700xcc,
22710xfb,
22720x4e,
22730xeb,
22740xbd,
22750x0f,
22760xf5,
22770xaf,
22780x01,
22790xfa,
22800xf1,
22810x7c,
22820x43,
22830x8c,
22840xb8,
22850x56,
22860x3e,
22870xbe,
22880x77,
22890x4e,
22900x2b,
22910xf7,
22920xbb,
22930xb7,
22940x45,
22950x47,
22960xcd,
22970xcc,
22980xa6,
22990x4c,
23000x72,
23010x7b,
23020x6a,
23030x2a,
23040x70,
23050x13,
23060x07,
23070xfd,
23080xb8,
23090x9c,
23100x98,
23110x3a,
23120xd8,
23130x23,
23140x67,
23150x5b,
23160x34,
23170xd5,
23180x14,
23190x0c,
23200xab,
23210x77,
23220x1f,
23230xf8,
23240x3d,
23250x5a,
23260x9f,
23270x92,
23280xb7,
23290x2c,
23300xad,
23310x31,
23320xde,
23330x61,
23340x07,
23350xb3,
23360x6b,
23370xf7,
23380x38,
23390x15,
23400x95,
23410x46,
23420x14,
23430x48,
23440x53,
23450x69,
23460x52,
23470x66,
23480x07,
23490x6d,
23500x83,
23510x71,
23520x8a,
23530x67,
23540x25,
23550x20,
23560x0f,
23570xfe,
23580xd7,
23590x02,
23600xd7,
23610x6e,
23620x2c,
23630xd2,
23640x1a,
23650x0a,
23660x5d,
23670xfd,
23680x0f,
23690x74,
23700xe3,
23710xa4,
23720x36,
23730x07,
23740x9a,
23750xdf,
23760xd4,
23770x79,
23780xbf,
23790xef,
23800x59,
23810xc0,
23820x44,
23830x52,
23840x87,
23850x9a,
23860x6e,
23870x1d,
23880x0e,
23890xee,
23900xde,
23910x2e,
23920x1a,
23930xa9,
23940x8f,
23950x3a,
23960xc9,
23970xba,
23980xec,
23990x99,
24000x78,
24010x2d,
24020x55,
24030x6b,
24040x14,
24050xc2,
24060x06,
24070xd5,
24080xfc,
24090x93,
24100x53,
24110x4d,
24120x11,
24130x8c,
24140xf8,
24150xfa,
24160x79,
24170x7c,
24180xa6,
24190x64,
24200xae,
24210x61,
24220xb8,
24230x7b,
24240x94,
24250x56,
24260xa6,
24270x39,
24280x78,
24290x9a,
24300xe5,
24310xc7,
24320xdf,
24330x18,
24340x63,
24350x23,
24360x9c,
24370xfa,
24380x66,
24390xbb,
24400xb7,
24410x5a,
24420x27,
24430x4c,
24440xd1,
24450xa1,
24460x83,
24470x22,
24480xb3,
24490x52,
24500x49,
24510x35,
24520xb0,
24530x22,
24540x83,
24550x59,
24560x12,
24570x00,
24580x16,
24590x98,
24600xdd,
24610xad,
24620xc2,
24630x94,
24640xf9,
24650xd3,
24660x7b,
24670x64,
24680x7f,
24690x44,
24700x3e,
24710x3c,
24720x8b,
24730x9a,
24740x83,
24750x9c,
24760x69,
24770x6b,
24780xe4,
24790xdf,
24800x9f,
24810xed,
24820x54,
24830x1f,
24840xe5,
24850x5d,
24860x7a,
24870x05,
24880x82,
24890xb3,
24900xdd,
24910xef,
24920xfc,
24930x53,
24940x96,
24950xb0,
24960x2c,
24970x5a,
24980xf8,
24990xdf,
25000x9c,
25010x8b,
25020x16,
25030x4e,
25040xdf,
25050xda,
25060x4d,
25070x09,
25080x09,
25090x69,
25100x50,
25110x03,
25120x65,
25130xd8,
25140x73,
25150x70,
25160xe8,
25170x86,
25180xbf,
25190xbb,
25200x35,
25210xce,
25220xb2,
25230x46,
25240xcb,
25250x02,
25260x00,
25270x5b,
25280xb4,
25290xe2,
25300xc6,
25310x8f,
25320x2f,
25330x98,
25340xaf,
25350x87,
25360x4b,
25370x48,
25380x45,
25390xed,
25400xcc,
25410x1d,
25420xe6,
25430x58,
25440xd6,
25450xf2,
25460x50,
25470x25,
25480x9f,
25490x52,
25500xc7,
25510xcb,
25520x8a,
25530x17,
25540x9d,
25550x5b,
25560xe5,
25570xc8,
25580xd7,
25590x72,
25600xb7,
25610x52,
25620xb2,
25630xc4,
25640x98,
25650xe3,
25660x7a,
25670x17,
25680x3e,
25690xc6,
25700x60,
25710xa7,
25720x97,
25730xb0,
25740xcf,
25750x18,
25760x81,
25770x53,
25780x84,
25790x4c,
25800xd5,
25810x17,
25820x32,
25830x03,
25840x13,
25850x39,
25860x51,
25870x09,
25880x10,
25890xe3,
25900x77,
25910x49,
25920x4f,
25930x62,
25940x01,
25950xbf,
25960x8c,
25970x9a,
25980xe0,
25990x41,
26000x9e,
26010x89,
26020x74,
26030x36,
26040xf9,
26050x96,
26060x86,
26070x2e,
26080x96,
26090x1c,
26100x4a,
26110xb7,
26120x2b,
26130x4a,
26140x97,
26150xbc,
26160x99,
26170x40,
26180xa3,
26190xe0,
26200x3d,
26210xc8,
26220xad,
26230x2f,
26240xdf,
26250x4f,
26260x2c,
26270xc4,
26280x69,
26290x82,
26300x9f,
26310x9b,
26320x81,
26330x0c,
26340x61,
26350x5c,
26360xa5,
26370x9d,
26380x8c,
26390x89,
26400xc0,
26410x2c,
26420xb4,
26430x4a,
26440x33,
26450x4e,
26460xeb,
26470xa2,
26480x56,
26490x40,
26500xc0,
26510xc2,
26520x46,
26530xaf,
26540x6a,
26550xfc,
26560x67,
26570xd1,
26580x80,
26590x5e,
26600xc5,
26610x6d,
26620x84,
26630x43,
26640x27,
26650x3f,
26660x55,
26670x15,
26680x96,
26690x6a,
26700xa0,
26710xa5,
26720xda,
26730xb7,
26740xff,
26750xb7,
26760x75,
26770x6e,
26780x4c,
26790x49,
26800x91,
26810x9d,
26820x22,
26830xa3,
26840x46,
26850xea,
26860xed,
26870x9a,
26880x00,
26890xe2,
26900x32,
26910xc3,
26920xd6,
26930xa9,
26940x71,
26950x20,
26960x55,
26970xa3,
26980x19,
26990xed,
27000xf8,
27010x4f,
27020xa7,
27030x12,
27040x9c,
27050x66,
27060x87,
27070xaf,
27080x4e,
27090xb7,
27100xf0,
27110xdb,
27120xbf,
27130xef,
27140xf0,
27150xf6,
27160xaf,
27170xea,
27180xda,
27190x09,
27200xfe,
27210xde,
27220x38,
27230x5c,
27240xa5,
27250xa2,
27260xdf,
27270x99,
27280x45,
27290xa8,
27300xe4,
27310xe7,
27320x92,
27330xac,
27340x67,
27350xaa,
27360x4f,
27370xbf,
27380x77,
27390x3e,
27400xa2,
27410x40,
27420x49,
27430x22,
27440x4a,
27450x1e,
27460x3b,
27470xaa,
27480x70,
27490x7f,
27500x95,
27510xaf,
27520x37,
27530x4b,
27540xfc,
27550x99,
27560xe2,
27570xe0,
27580xba,
27590xd7,
27600x34,
27610xce,
27620x55,
27630x88,
27640x5b,
27650x84,
27660x1b,
27670x57,
27680xc4,
27690x80,
27700x03,
27710x53,
27720xc9,
27730x2f,
27740x93,
27750x04,
27760x4d,
27770xd5,
27780x96,
27790xe5,
27800x70,
27810xa6,
27820x6e,
27830x63,
27840x5d,
27850x9d,
27860x6c,
27870xdb,
27880x02,
27890x0a,
27900xa9,
27910xda,
27920x8b,
27930x53,
27940xdc,
27950xd9,
27960x9a,
27970xc5,
27980x94,
27990x2c,
28000x91,
28010x92,
28020x2a,
28030xde,
28040xbb,
28050x8b,
28060x13,
28070xb9,
28080x19,
28090x96,
28100x64,
28110xcc,
28120xf2,
28130x64,
28140x39,
28150xb7,
28160x75,
28170x49,
28180xe9,
28190x86,
28200xc2,
28210x86,
28220x62,
28230xd9,
28240x24,
28250xd3,
28260x81,
28270x35,
28280x49,
28290xfc,
28300xa0,
28310xa5,
28320xa0,
28330x93,
28340x05,
28350x64,
28360xb4,
28370x1a,
28380x57,
28390xce,
28400x0c,
28410x90,
28420x02,
28430x27,
28440xc5,
28450x7a,
28460x2b,
28470x5d,
28480xae,
28490x3e,
28500xd5,
28510xdd,
28520x10,
28530x7c,
28540x14,
28550xea,
28560x3a,
28570x08,
28580xac,
28590x72,
28600x4e,
28610x90,
28620x3d,
28630x3b,
28640x7c,
28650x86,
28660x2e,
28670xeb,
28680xd4,
28690x06,
28700x70,
28710xe6,
28720xc7,
28730xfb,
28740x5f,
28750xbd,
28760x18,
28770xf4,
28780x11,
28790xa4,
28800x1a,
28810x93,
28820xc3,
28830xbe,
28840xd9,
28850xfb,
28860x26,
28870x48,
28880x2f,
28890x37,
28900x3c,
28910xd0,
28920x03,
28930x47,
28940x1a,
28950xf7,
28960x62,
28970x19,
28980x24,
28990x5c,
29000xf4,
29010xa8,
29020x92,
29030x20,
29040x7a,
29050xf2,
29060x9e,
29070x2a,
29080xc5,
29090x95,
29100xa2,
29110xfb,
29120xa4,
29130xea,
29140x85,
29150xd8,
29160x56,
29170xb7,
29180x70,
29190xd1,
29200x60,
29210x30,
29220xa5,
29230x30,
29240x82,
29250x70,
29260xdc,
29270x7a,
29280x65,
29290x8a,
29300x36,
29310x3f,
29320x5b,
29330x0c,
29340xae,
29350x54,
29360x7c,
29370xd3,
29380x57,
29390x84,
29400x7b,
29410x3a,
29420x65,
29430x18,
29440x81,
29450xee,
29460x05,
29470x9b,
29480x44,
29490x4d,
29500xb8,
29510xda,
29520xa2,
29530xa1,
29540xc9,
29550x15,
29560xd3,
29570x73,
29580x03,
29590x0e,
29600x43,
29610xe9,
29620x8e,
29630x15,
29640xf9,
29650xbe,
29660xc6,
29670xc5,
29680x8a,
29690xe5,
29700xc0,
29710x1e,
29720xc2,
29730x37,
29740x9e,
29750x2a,
29760x26,
29770xa5,
29780xa0,
29790xbd,
29800x24,
29810x5f,
29820xb9,
29830xc1,
29840xab,
29850x34,
29860x48,
29870xb9,
29880x5d,
29890x98,
29900xb4,
29910x65,
29920x18,
29930xf3,
29940x63,
29950x19,
29960x44,
29970x1b,
29980x11,
29990x16,
30000xff,
30010xdc,
30020xf1,
30030x79,
30040x08,
30050x86,
30060x0f,
30070x52,
30080x98,
30090x73,
30100xc4,
30110x92,
30120x90,
30130x2b,
30140x47,
30150x09,
30160xd0,
30170x43,
30180x6c,
30190x2f,
30200x20,
30210xeb,
30220xdc,
30230xda,
30240xc5,
30250x08,
30260x7b,
30270x94,
30280x42,
30290x30,
30300x6a,
30310xc7,
30320xda,
30330x8c,
30340xc3,
30350x76,
30360xa7,
30370xa5,
30380xcc,
30390x62,
30400x13,
30410x00,
30420x60,
30430x31,
30440x58,
30450x44,
30460x9b,
30470xf5,
30480x64,
30490x14,
30500xf5,
30510x11,
30520xc5,
30530x54,
30540x52,
30550x83,
30560xd4,
30570x73,
30580x01,
30590x16,
30600x0e,
30610xb3,
30620x7a,
30630x29,
30640x69,
30650x35,
30660x56,
30670xd4,
30680xee,
30690x8a,
30700x17,
30710xa2,
30720x99,
30730x24,
30740x9c,
30750xd7,
30760x8f,
30770xdb,
30780x55,
30790xb5,
30800x3e
3081};
diff --git a/keyboards/molecule/config.h b/keyboards/molecule/config.h
new file mode 100755
index 000000000..e3bc5ad34
--- /dev/null
+++ b/keyboards/molecule/config.h
@@ -0,0 +1,159 @@
1/*
2Copyright 2021 bbrfkr
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#pragma once
19
20#include "config_common.h"
21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0xFEED
24#define PRODUCT_ID 0x0000
25#define DEVICE_VER 0x0001
26#define MANUFACTURER bbrfkr
27#define PRODUCT molecule
28
29/* key matrix size */
30#define MATRIX_ROWS 4
31#define MATRIX_COLS 10
32
33/*
34 * Keyboard Matrix Assignments
35 *
36 * Change this to how you wired your keyboard
37 * COLS: AVR pins used for columns, left to right
38 * ROWS: AVR pins used for rows, top to bottom
39 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
40 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
41 *
42 */
43#define MATRIX_ROW_PINS { F4, F5, F6, B6 }
44#define MATRIX_COL_PINS { D3, D2, D1, D0, D4, C6, D7, E6, B4, B5 }
45#define UNUSED_PINS
46
47/* COL2ROW, ROW2COL */
48#define DIODE_DIRECTION ROW2COL
49
50/*
51 * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
52 */
53// #define SOFT_SERIAL_PIN D2 // or D1, D2, D3, E6
54// #define USE_SERIAL
55
56//#define BACKLIGHT_PIN B7
57//#define BACKLIGHT_LEVELS 3
58//#define BACKLIGHT_BREATHING
59
60/* underglow LED */
61// #define RGB_DI_PIN D3
62// #ifdef RGBLIGHT_ENABLE
63// # define RGBLED_NUM 10
64// # define RGBLED_SPLIT { 5, 5 }
65// # define RGBLIGHT_ANIMATIONS
66// #endif
67
68//#define RGB_DI_PIN E2
69//#ifdef RGB_DI_PIN
70//# define RGBLED_NUM 16
71//# define RGBLIGHT_HUE_STEP 8
72//# define RGBLIGHT_SAT_STEP 8
73//# define RGBLIGHT_VAL_STEP 8
74//# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
75//# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
76/*== all animations enable ==*/
77//# define RGBLIGHT_ANIMATIONS
78/*== or choose animations ==*/
79//# define RGBLIGHT_EFFECT_BREATHING
80//# define RGBLIGHT_EFFECT_RAINBOW_MOOD
81//# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
82//# define RGBLIGHT_EFFECT_SNAKE
83//# define RGBLIGHT_EFFECT_KNIGHT
84//# define RGBLIGHT_EFFECT_CHRISTMAS
85//# define RGBLIGHT_EFFECT_STATIC_GRADIENT
86//# define RGBLIGHT_EFFECT_RGB_TEST
87//# define RGBLIGHT_EFFECT_ALTERNATING
88/*== customize breathing effect ==*/
89/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
90//# define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
91/*==== use exp() and sin() ====*/
92//# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
93//# define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
94//#endif
95
96
97/* OLED */
98#define OLED_TIMEOUT 0
99
100/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
101#define DEBOUNCE 5
102
103/* define if matrix has ghost (lacks anti-ghosting diodes) */
104//#define MATRIX_HAS_GHOST
105
106/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
107#define LOCKING_SUPPORT_ENABLE
108/* Locking resynchronize hack */
109#define LOCKING_RESYNC_ENABLE
110
111/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
112 * This is useful for the Windows task manager shortcut (ctrl+shift+esc).
113 */
114//#define GRAVE_ESC_CTRL_OVERRIDE
115
116/*
117 * Force NKRO
118 *
119 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
120 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
121 * makefile for this to work.)
122 *
123 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
124 * until the next keyboard reset.
125 *
126 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
127 * fully operational during normal computer usage.
128 *
129 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
130 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
131 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
132 * power-up.
133 *
134 */
135//#define FORCE_NKRO
136
137/*
138 * Feature disable options
139 * These options are also useful to firmware size reduction.
140 */
141
142/* disable debug print */
143//#define NO_DEBUG
144
145/* disable print */
146//#define NO_PRINT
147
148/* disable action features */
149//#define NO_ACTION_LAYER
150//#define NO_ACTION_TAPPING
151//#define NO_ACTION_ONESHOT
152
153/* disable these deprecated features by default */
154#define NO_ACTION_MACRO
155#define NO_ACTION_FUNCTION
156
157/* Bootmagic Lite key configuration */
158//#define BOOTMAGIC_LITE_ROW 0
159//#define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/molecule/info.json b/keyboards/molecule/info.json
new file mode 100755
index 000000000..516464b7a
--- /dev/null
+++ b/keyboards/molecule/info.json
@@ -0,0 +1,215 @@
1{
2 "keyboard_name": "molecule",
3 "url": "https://github.com/bbrfkr/keyboards/tree/master/molecule",
4 "maintainer": "bbrfkr",
5 "width": 14.75,
6 "height": 5,
7 "layouts": {
8 "LAYOUT": {
9 "layout": [
10 {
11 "label":"E",
12 "x":2,
13 "y":0
14 },
15 {
16 "label":"I",
17 "x":11.75,
18 "y":0
19 },
20 {
21 "label":"W",
22 "x":1,
23 "y":0.25
24 },
25 {
26 "label":"O",
27 "x":12.75,
28 "y":0.25
29 },
30 {
31 "label":"R",
32 "x":3,
33 "y":0.5
34 },
35 {
36 "label":"U",
37 "x":10.75,
38 "y":0.5
39 },
40 {
41 "label":"T",
42 "x":4,
43 "y":0.75
44 },
45 {
46 "label":"Y",
47 "x":9.75,
48 "y":0.75
49 },
50 {
51 "label":"Q",
52 "x":0,
53 "y":1
54 },
55 {
56 "label":"D",
57 "x":2,
58 "y":1
59 },
60 {
61 "label":"K",
62 "x":11.75,
63 "y":1
64 },
65 {
66 "label":"P",
67 "x":13.75,
68 "y":1
69 },
70 {
71 "label":"S",
72 "x":1,
73 "y":1.25
74 },
75 {
76 "label":"L",
77 "x":12.75,
78 "y":1.25
79 },
80 {
81 "label":"F",
82 "x":3,
83 "y":1.5
84 },
85 {
86 "label":"J",
87 "x":10.75,
88 "y":1.5
89 },
90 {
91 "label":"G",
92 "x":4,
93 "y":1.75
94 },
95 {
96 "label":"H",
97 "x":9.75,
98 "y":1.75
99 },
100 {
101 "label":"A",
102 "x":0,
103 "y":2
104 },
105 {
106 "label":"C",
107 "x":2,
108 "y":2
109 },
110 {
111 "label":",",
112 "x":11.75,
113 "y":2
114 },
115 {
116 "label":";",
117 "x":13.75,
118 "y":2
119 },
120 {
121 "label":"X",
122 "x":1,
123 "y":2.25
124 },
125 {
126 "label":".",
127 "x":12.75,
128 "y":2.25
129 },
130 {
131 "label":"V",
132 "x":3,
133 "y":2.5
134 },
135 {
136 "label":"M",
137 "x":10.75,
138 "y":2.5
139 },
140 {
141 "label":"B",
142 "x":4,
143 "y":2.75
144 },
145 {
146 "label":"N",
147 "x":9.75,
148 "y":2.75
149 },
150 {
151 "label":"Z",
152 "x":0,
153 "y":3
154 },
155 {
156 "label":"Shift",
157 "x":2,
158 "y":3
159 },
160 {
161 "label":"Alt",
162 "x":5.25,
163 "y":3
164 },
165 {
166 "label":"Super",
167 "x":8.5,
168 "y":3
169 },
170 {
171 "label":"Shift",
172 "x":11.75,
173 "y":3
174 },
175 {
176 "label":"/",
177 "x":13.75,
178 "y":3
179 },
180 {
181 "label":"Ctrl",
182 "x":1,
183 "y":3.25
184 },
185 {
186 "label":"Space",
187 "x":6.25,
188 "y":3.25,
189 "h":1.5
190 },
191 {
192 "label":"Enter",
193 "x":7.5,
194 "y":3.25,
195 "h":1.5
196 },
197 {
198 "label":"Ctrl",
199 "x":12.75,
200 "y":3.25
201 },
202 {
203 "label":"Lower",
204 "x":5.25,
205 "y":4
206 },
207 {
208 "label":"Raise",
209 "x":8.5,
210 "y":4
211 }
212 ]
213 }
214 }
215} \ No newline at end of file
diff --git a/keyboards/molecule/keymaps/default/keymap.c b/keyboards/molecule/keymaps/default/keymap.c
new file mode 100755
index 000000000..ddc01403c
--- /dev/null
+++ b/keyboards/molecule/keymaps/default/keymap.c
@@ -0,0 +1,39 @@
1/* Copyright 2021 bbrfkr
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include QMK_KEYBOARD_H
17
18// Defines names for use in layer keycodes and the keymap
19enum layer_names {
20 _QWERTY_BASE,
21 _EUCALYN_BASE,
22 _LOWER,
23 _RAISE,
24 _FN,
25};
26
27// Defines the keycodes used by our macros in process_record_user
28enum custom_keycodes {
29 QMKBEST = SAFE_RANGE,
30 QMKURL
31};
32
33const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
34 [_QWERTY_BASE] = LAYOUT(KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LCTL, KC_LSFT, MO(2), KC_LALT, KC_SPC, KC_ENT, KC_RGUI, MO(3), KC_RSFT, KC_RCTL),
35 [_EUCALYN_BASE] = LAYOUT(KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_B, KC_H, KC_J, KC_L, KC_SLSH, KC_LCTL, KC_LSFT, MO(2), KC_LALT, KC_SPC, KC_ENT, KC_RGUI, MO(3), KC_RSFT, KC_RCTL),
36 [_LOWER] = LAYOUT(KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F2, KC_F3, KC_WH_U, KC_F4, KC_F5, KC_F6, KC_F7, KC_UP, KC_F8, KC_F9, KC_F1, KC_MS_BTN2, KC_WH_D, KC_MS_BTN1, KC_F11, KC_F12, KC_LEFT, KC_DOWN, KC_RGHT, KC_F10, KC_LCTL, KC_LSFT, KC_TRNS, KC_LALT, KC_SPC, KC_ENT, KC_RGUI, MO(4), KC_RSFT, KC_RCTL),
37 [_RAISE] = LAYOUT(KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ESC, KC_DEL, KC_BSPC, KC_GRV, KC_BSLS, KC_MINS, KC_EQL, KC_QUOT, KC_LCBR, KC_RCBR, KC_CAPS, KC_TAB, KC_PSCR, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_DQUO, KC_LBRC, KC_RBRC, KC_LCTL, KC_LSFT, MO(4), KC_LALT, KC_SPC, KC_ENT, KC_RGUI, KC_TRNS, KC_RSFT, KC_RCTL),
38 [_FN] = LAYOUT(KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BRIU, KC_VOLD, KC_NO, KC_NO, KC_NO, DF(0), DF(1), KC_NO, KC_NO, KC_NO, KC_BRID, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LSFT, KC_TRNS, KC_LALT, KC_SPC, KC_ENT, KC_RGUI, KC_TRNS, KC_RSFT, KC_RCTL)
39};
diff --git a/keyboards/molecule/keymaps/default/readme.md b/keyboards/molecule/keymaps/default/readme.md
new file mode 100755
index 000000000..136c2c986
--- /dev/null
+++ b/keyboards/molecule/keymaps/default/readme.md
@@ -0,0 +1 @@
# The default keymap for molecule
diff --git a/keyboards/molecule/molecule.c b/keyboards/molecule/molecule.c
new file mode 100755
index 000000000..c5f035289
--- /dev/null
+++ b/keyboards/molecule/molecule.c
@@ -0,0 +1,17 @@
1/* Copyright 2021 bbrfkr
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "molecule.h"
diff --git a/keyboards/molecule/molecule.h b/keyboards/molecule/molecule.h
new file mode 100755
index 000000000..2db7a92ad
--- /dev/null
+++ b/keyboards/molecule/molecule.h
@@ -0,0 +1,40 @@
1/* Copyright 2021 bbrfkr
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19#include "quantum.h"
20
21/* This is a shortcut to help you visually see your layout.
22 *
23 * The first section contains all of the arguments representing the physical
24 * layout of the board and position of the keys.
25 *
26 * The second converts the arguments into a two-dimensional array which
27 * represents the switch matrix.
28 */
29#define LAYOUT( \
30 L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \
31 L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \
32 L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \
33 L30, L31, L32, L33, L34, R30, R31, R32, R33, R34 \
34 ) \
35 { \
36 { L00, L01, L02, L03, L04, R00, R01, R02, R03, R04 }, \
37 { L10, L11, L12, L13, L14, R10, R11, R12, R13, R14 }, \
38 { L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 }, \
39 { L30, L31, L32, L33, L34, R30, R31, R32, R33, R34 }, \
40 }
diff --git a/keyboards/molecule/readme.md b/keyboards/molecule/readme.md
new file mode 100755
index 000000000..1538157ec
--- /dev/null
+++ b/keyboards/molecule/readme.md
@@ -0,0 +1,21 @@
1# molecule
2
3[![molecule](https://imgur.com/uYCeS4Y)](https://i.imgur.com/uYCeS4Yh.jpg)
4
5A 40 keys keyboard with trackball.
6
7* Keyboard Maintainer: [bbrfkr](https://github.com/bbrfkr) [@bbrfkr](https://twitter.com/bbrfkr)
8* Hardware Supported: molecule PCB, Pro Micro
9* Hardware Availability: https://bbrfkr.booth.pm/
10
11Make example for this keyboard (after setting up your build environment):
12
13 make molecule:default
14
15Flashing example for this keyboard:
16
17 make molecule:default:flash
18
19See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
20
21This keyboard project includes [aball](https://github.com/brickbots/aball) project source code partially.
diff --git a/keyboards/molecule/rules.mk b/keyboards/molecule/rules.mk
new file mode 100755
index 000000000..9130ab8ec
--- /dev/null
+++ b/keyboards/molecule/rules.mk
@@ -0,0 +1,27 @@
1# MCU name
2MCU = atmega32u4
3
4# Bootloader selection
5BOOTLOADER = atmel-dfu
6
7# Build Options
8# change yes to no to disable
9#
10BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
11MOUSEKEY_ENABLE = yes # Mouse keys
12EXTRAKEY_ENABLE = yes # Audio control and System control
13CONSOLE_ENABLE = no # Console for debug
14COMMAND_ENABLE = no # Commands for debug and configuration
15# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
16SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
17# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
18NKRO_ENABLE = no # USB Nkey Rollover
19BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
20RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
21BLUETOOTH_ENABLE = no # Enable Bluetooth
22AUDIO_ENABLE = no # Audio output
23
24# Add trackball support
25POINTING_DEVICE_ENABLE = yes
26SRC += adns.c
27QUANTUM_LIB_SRC += spi_master.c