|
|
|
module descriptors (input CLK, /*input RESET, input RD_REQUEST,*/ input /*[1:0]*/ DESC_TYPE, input [6:0] ADR, output /*reg*/ [7:0] VAL/*, input [63:0] kbd_report*/);
|
|
|
|
|
|
|
|
parameter HID_REPORT_DESC_LEN = 63;
|
|
|
|
wire [7:0] RAM_ADR;
|
|
|
|
|
|
|
|
assign RAM_ADR[6:0] = ADR[6:0];
|
|
|
|
assign RAM_ADR[7] = DESC_TYPE;
|
|
|
|
//reg [(8*30-1):0] i2c_hid_desc;// = 'h_1E_00__00_01__46_00__02_00__03_00__0A_00__04_00__03_00__05_00__06_00__9F_04__01_01__00_01__00_00_00_00;
|
|
|
|
//reg [(8*HID_REPORT_DESC_LEN-1):0] hid_report_desc;
|
|
|
|
|
|
|
|
//parameter READ_ADRESS_OFFSET = 2;
|
|
|
|
|
|
|
|
//reg last_rd_request = 0;
|
|
|
|
//reg tx_flag = 0; // AT POSEDGE OF RD_REQUEST DATA FROM RAM MOVES TO RAM_RD_REG, AT NEXT CLK DATA MUST BE WRITE TO VAL
|
|
|
|
//reg [6:0] real_adress;
|
|
|
|
//reg [7:0] ram_rd_t1;
|
|
|
|
//reg [7:0] ram_rd_t2;
|
|
|
|
|
|
|
|
//always @ (posedge CLK) begin
|
|
|
|
//if (RESET == 0) begin
|
|
|
|
//i2c_hid_desc <= 'h_1E_00__00_01__50_00__02_00__03_00__0A_00__04_00__03_00__05_00__06_00__9F_04__01_01__00_01__00_00_00_00;
|
|
|
|
//hid_report_desc <= 'h__05_01__09_06__A1_01__05_07__85_01___19_E0__29_E7__15_00__25_01__75_01__95_08__81_02___95_01__75_08__81_01___95_05__75_01__05_05__85_01__19_01__29_05__91_02___95_01__75_03__91_03___95_06__75_08__15_00__25_65__05_07__19_00__29_65__81_00__C0;
|
|
|
|
//i2c_hid_desc [207:200] <= HID_REPORT_DESC_LEN[7:0];
|
|
|
|
//i2c_hid_desc [199:192] <= HID_REPORT_DESC_LEN[15:8];
|
|
|
|
// last_rd_request <= 0;
|
|
|
|
// real_adress = 0;
|
|
|
|
//end
|
|
|
|
// else begin
|
|
|
|
/*if (tx_flag == 1) begin // NEXT CLK AFTER POSEDGE REQUEST
|
|
|
|
if (DESC_TYPE == 1)
|
|
|
|
VAL <= ram_rd_t1;
|
|
|
|
else
|
|
|
|
VAL <= ram_rd_t2;
|
|
|
|
tx_flag = 0;*/
|
|
|
|
//end
|
|
|
|
// if ((last_rd_request == 0) && (RD_REQUEST == 1)) begin
|
|
|
|
// if (DESC_TYPE == 1)
|
|
|
|
// real_adress = ADR;
|
|
|
|
// else
|
|
|
|
// real_adress = ADR + 32;
|
|
|
|
//if (DESC_TYPE == 1) begin
|
|
|
|
// tx_flag = 1; // WAIT NEXT CLK
|
|
|
|
/* case (ADR) 2: VAL <= 8'h1E; 3: VAL <= 0; // 2-3 - DESCR LEN (30),
|
|
|
|
4: VAL <= 0; 5: VAL <= 1; // 4-5 - bcdVersion
|
|
|
|
6: VAL <= HID_REPORT_DESC_LEN[7:0]; 7: VAL <= HID_REPORT_DESC_LEN[15:8];
|
|
|
|
8: VAL <= 2; 9: VAL <= 0; // 8-9 - REPORT DESC ADR
|
|
|
|
10: VAL <= 3; 11: VAL <= 0; // 10-11 - INPUT REG ADR
|
|
|
|
12: VAL <= 10; 13: VAL <= 0; // 12-13 - INPUT REG LEN
|
|
|
|
14: VAL <= 4; 15: VAL <= 0; // 14-15 - OUT REG ADR
|
|
|
|
16: VAL <= 3; 17: VAL <= 0; // 16-17 - OUT REG LEN
|
|
|
|
18: VAL <= 5; 19: VAL <= 0; // 18-19 - CMD REG ADR
|
|
|
|
20: VAL <= 6; 21: VAL <= 0; // 20-21 - DATA REG ADR
|
|
|
|
22: VAL <= 8'h9F; 23: VAL <= 4; // 22-23 - VENDOR ID
|
|
|
|
24: VAL <= 1; 25: VAL <= 1; // 24-25 - DEVICE ID
|
|
|
|
26: VAL <= 0; 27: VAL <= 1; // 26-27 - VERSION
|
|
|
|
28: VAL <= 0; 29: VAL <= 0; 30: VAL <= 0; 31: VAL <= 0; // 28-31 - RSVD
|
|
|
|
default: VAL <= 0;
|
|
|
|
endcase*/
|
|
|
|
|
|
|
|
/*end
|
|
|
|
else if (DESC_TYPE == 2) begin
|
|
|
|
case (ADR) 2: VAL <= 8'h05; 3: VAL <= 8'h01;
|
|
|
|
4: VAL <= 8'h09; 5: VAL <= 8'h06;
|
|
|
|
6: VAL <= 8'hA1; 7: VAL <= 8'h01;
|
|
|
|
8: VAL <= 8'h05; 9: VAL <= 8'h07;
|
|
|
|
//10: VAL <= 8'h85; 11: VAL <= 8'h01;
|
|
|
|
// MODIFIERS DESC
|
|
|
|
10: VAL <= 8'h19; 11: VAL <= 8'hE0;
|
|
|
|
12: VAL <= 8'h29; 13: VAL <= 8'hE7;
|
|
|
|
14: VAL <= 8'h15; 15: VAL <= 8'h00;
|
|
|
|
16: VAL <= 8'h25; 17: VAL <= 8'h01;
|
|
|
|
18: VAL <= 8'h75; 19: VAL <= 8'h01;
|
|
|
|
20: VAL <= 8'h95; 21: VAL <= 8'h08;
|
|
|
|
22: VAL <= 8'h81; 23: VAL <= 8'h02;
|
|
|
|
// RESERVED BYTE
|
|
|
|
24: VAL <= 8'h95; 25: VAL <= 8'h01;
|
|
|
|
26: VAL <= 8'h75; 27: VAL <= 8'h08;
|
|
|
|
28: VAL <= 8'h81; 29: VAL <= 8'h01;
|
|
|
|
// LEDS
|
|
|
|
30: VAL <= 8'h95; 31: VAL <= 8'h05;
|
|
|
|
32: VAL <= 8'h75; 33: VAL <= 8'h01;
|
|
|
|
34: VAL <= 8'h05; 35: VAL <= 8'h08;
|
|
|
|
36: VAL <= 8'h19; 37: VAL <= 8'h01;
|
|
|
|
38: VAL <= 8'h29; 39: VAL <= 8'h05;
|
|
|
|
40: VAL <= 8'h91; 41: VAL <= 8'h02;
|
|
|
|
// RESERVED 3 BITS
|
|
|
|
42: VAL <= 8'h95; 43: VAL <= 8'h01;
|
|
|
|
44: VAL <= 8'h75; 45: VAL <= 8'h03;
|
|
|
|
46: VAL <= 8'h91; 47: VAL <= 8'h03;
|
|
|
|
// SIX KEYS (NON-MODIFIERS)
|
|
|
|
48: VAL <= 8'h95; 49: VAL <= 8'h06;
|
|
|
|
50: VAL <= 8'h75; 51: VAL <= 8'h08;
|
|
|
|
52: VAL <= 8'h15; 53: VAL <= 8'h00;
|
|
|
|
54: VAL <= 8'h25; 55: VAL <= 8'h65;
|
|
|
|
56: VAL <= 8'h05; 57: VAL <= 8'h07;
|
|
|
|
58: VAL <= 8'h19; 59: VAL <= 8'h00;
|
|
|
|
60: VAL <= 8'h29; 61: VAL <= 8'h65;
|
|
|
|
62: VAL <= 8'h81; 63: VAL <= 8'h00;
|
|
|
|
// END COLLECTION
|
|
|
|
64: VAL <= 8'hC0;
|
|
|
|
default: VAL <= 0;
|
|
|
|
endcase
|
|
|
|
end*/
|
|
|
|
/*if (READ_TYPE == 1) begin
|
|
|
|
if ((READ_ADRESS < READ_ADRESS_OFFSET) || (READ_ADRESS > (READ_ADRESS_OFFSET + 30 - 1)))
|
|
|
|
VAL <= 0;
|
|
|
|
else
|
|
|
|
VAL <= i2c_hid_desc[ (8 * (30 - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 7) : (8 * (30 - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 0) ];
|
|
|
|
end*/
|
|
|
|
/*else if (READ_TYPE == 2) begin
|
|
|
|
if ((READ_ADRESS < READ_ADRESS_OFFSET) || (READ_ADRESS > (READ_ADRESS_OFFSET + HID_REPORT_DESC_LEN - 1)))
|
|
|
|
VAL <= 0;
|
|
|
|
else
|
|
|
|
VAL <= hid_report_desc[ (8 * (HID_REPORT_DESC_LEN - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 7) : (8 * (HID_REPORT_DESC_LEN - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 0) ];
|
|
|
|
end*/
|
|
|
|
/*else if (READ_TYPE == 3) begin
|
|
|
|
if ((READ_ADRESS < READ_ADRESS_OFFSET) || (READ_ADRESS > (READ_ADRESS_OFFSET + 10 - 1)))
|
|
|
|
VAL <= 0;
|
|
|
|
else if (READ_ADRESS == READ_ADRESS_OFFSET)
|
|
|
|
VAL <= 10;
|
|
|
|
else if (READ_ADRESS == (READ_ADRESS_OFFSET + 1))
|
|
|
|
VAL <= 0;
|
|
|
|
else
|
|
|
|
VAL <= kbd_report[ (8 * (10 - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 7) : (8 * (10 - READ_ADRESS + READ_ADRESS_OFFSET - 1) + 0) ];
|
|
|
|
end*/
|
|
|
|
// end
|
|
|
|
// last_rd_request <= RD_REQUEST;
|
|
|
|
// end
|
|
|
|
//end
|
|
|
|
|
|
|
|
/* 2: VAL <= 8'h1E; 3: VAL <= 0; // 2-3 - DESCR LEN (30),
|
|
|
|
4: VAL <= 0; 5: VAL <= 1; // 4-5 - bcdVersion
|
|
|
|
6: VAL <= HID_REPORT_DESC_LEN[7:0]; 7: VAL <= HID_REPORT_DESC_LEN[15:8];
|
|
|
|
8: VAL <= 2; 9: VAL <= 0; // 8-9 - REPORT DESC ADR
|
|
|
|
10: VAL <= 3; 11: VAL <= 0; // 10-11 - INPUT REG ADR
|
|
|
|
12: VAL <= 10; 13: VAL <= 0; // 12-13 - INPUT REG LEN
|
|
|
|
14: VAL <= 4; 15: VAL <= 0; // 14-15 - OUT REG ADR
|
|
|
|
16: VAL <= 3; 17: VAL <= 0; // 16-17 - OUT REG LEN
|
|
|
|
18: VAL <= 5; 19: VAL <= 0; // 18-19 - CMD REG ADR
|
|
|
|
20: VAL <= 6; 21: VAL <= 0; // 20-21 - DATA REG ADR
|
|
|
|
22: VAL <= 8'h9F; 23: VAL <= 4; // 22-23 - VENDOR ID
|
|
|
|
24: VAL <= 1; 25: VAL <= 1; // 24-25 - DEVICE ID
|
|
|
|
26: VAL <= 0; 27: VAL <= 1; // 26-27 - VERSION
|
|
|
|
28: VAL <= 0; 29: VAL <= 0; 30: VAL <= 0; 31: VAL <= 0; // 28-31 - RSVD
|
|
|
|
*/
|
|
|
|
|
|
|
|
SB_RAM40_4K #(
|
|
|
|
/*.INIT_0(256'h0000_0004__0000_000A__0000_0003__0000_0002__0000_003F__0001_0000__0000_001E___0000_0000),
|
|
|
|
.INIT_1(256'h0000_0000__0000_0000__0001_0000__0001_0001__0004_009F__0000_0006__0000_0005___0000_0003),*/
|
|
|
|
.INIT_0(256'h0003__0000_0004__0000_000A__0000_0003__0000_0002__0000_003F__0001_0000__0000_001E___0000),
|
|
|
|
.INIT_1(256'h0000__0000_0000__0000_0000__0001_0000__0001_0001__0004_009F__0000_0006__0000_0005___0000),
|
|
|
|
.INIT_8(256'h0025__0000_0015__00E7_0029__00E0_0019__0007_0005__0001_00A1__0006_0009__0001_0005___0000),
|
|
|
|
.INIT_9(256'h0075__0005_0095__0001_0081__0008_0075__0001_0095__0002_0081__0008_0095__0001_0075___0001),
|
|
|
|
.INIT_A(256'h0095__0003_0091__0003_0075__0001_0095__0002_0091__0005_0029__0001_0019__0008_0005___0001),
|
|
|
|
.INIT_B(256'h00C0__0000_0081__0065_0029__0000_0019__0007_0005__0065_0025__0000_0015__0008_0075___0006),
|
|
|
|
.INIT_C(256'h0000__0000_0000__0000_0000__0000_0000__0000_0000__0000_0000__0000_0000__0000_0000___0000),
|
|
|
|
.WRITE_MODE(1),
|
|
|
|
.READ_MODE(1)
|
|
|
|
) descriptors (
|
|
|
|
.RDATA(VAL),
|
|
|
|
.RADDR(RAM_ADR/*real_adress*/),
|
|
|
|
.RCLK(CLK),
|
|
|
|
.RCLKE(1'b1),
|
|
|
|
.RE(1'b1),
|
|
|
|
.WADDR(8'b0),
|
|
|
|
.WCLK(1'b0),
|
|
|
|
.WCLKE(1'b0),
|
|
|
|
.WDATA(8'b0),
|
|
|
|
.WE(1'b0)
|
|
|
|
);
|
|
|
|
/*
|
|
|
|
SB_RAM40_4K #(
|
|
|
|
.INIT_0(256'h0000_0004__0000_000A__0000_0003__0000_0002__0000_003F__0001_0000__0000_001E___0000_0000),
|
|
|
|
.INIT_1(256'h0000_0000__0000_0000__0001_0000__0001_0001__0004_009F__0000_0006__0000_0005___0000_0003),
|
|
|
|
.WRITE_MODE(1),
|
|
|
|
.READ_MODE(1)
|
|
|
|
) i2c_hid_desc (
|
|
|
|
.RDATA(ram_rd_t1),
|
|
|
|
.RADDR(ADR),
|
|
|
|
.RCLK(CLK),
|
|
|
|
.RCLKE(1'b1),
|
|
|
|
.RE(1'b1),
|
|
|
|
.WADDR(8'b0),
|
|
|
|
.WCLK(1'b0),
|
|
|
|
.WCLKE(1'b0),
|
|
|
|
.WDATA(8'b0),
|
|
|
|
.WE(1'b0)
|
|
|
|
);
|
|
|
|
|
|
|
|
SB_RAM40_4K #(
|
|
|
|
.INIT_0(256'h0000_0015__00E7_0029__00E0_0019__0007_0005__0001_00A1__0006_0009__0001_0005___0000_0000),
|
|
|
|
.INIT_1(256'h0005_0095__0001_0081__0008_0075__0001_0095__0002_0081__0008_0095__0001_0075___0001_0025),
|
|
|
|
.INIT_2(256'h0003_0091__0003_0075__0001_0095__0002_0091__0005_0029__0001_0019__0008_0005___0001_0075),
|
|
|
|
.INIT_3(256'h0000_0081__0065_0029__0000_0019__0007_0005__0065_0025__0000_0015__0008_0075___0006_0095),
|
|
|
|
.INIT_4(256'h0000_0000__0000_0000__0000_0000__0000_0000__0000_0000__0000_0000__0000_0000___0000_00C0),
|
|
|
|
.WRITE_MODE(1),
|
|
|
|
.READ_MODE(1)
|
|
|
|
) hid_report_desc (
|
|
|
|
.RDATA(ram_rd_t2),
|
|
|
|
.RADDR(ADR),
|
|
|
|
.RCLK(CLK),
|
|
|
|
.RCLKE(1'b1),
|
|
|
|
.RE(1'b1),
|
|
|
|
.WADDR(8'b0),
|
|
|
|
.WCLK(1'b0),
|
|
|
|
.WCLKE(1'b0),
|
|
|
|
.WDATA(8'b0),
|
|
|
|
.WE(1'b0)
|
|
|
|
);*/
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
//static const uint8 hid_descriptor_keyboard[] = {
|
|
|
|
//****/ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ 2
|
|
|
|
//****/ 0x09, 0x06, /* USAGE (Keyboard) */ 4
|
|
|
|
//****/ 0xa1, 0x01, /* COLLECTION (Application) */ 6
|
|
|
|
//******/ 0x05, 0x07, /* USAGE_PAGE (Keyboard) */ 8
|
|
|
|
//******/ 0x85, 0x01, /* REPORT_ID (1) */ 10
|
|
|
|
/* Ctrl, Shift and other modifier keys, 8 in total */
|
|
|
|
//******/ 0x19, 0xe0, /* USAGE_MINIMUM (kbd LeftControl) */ 12
|
|
|
|
//******/ 0x29, 0xe7, /* USAGE_MAXIMUM (kbd Right GUI) */ 14
|
|
|
|
//******/ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 16
|
|
|
|
//******/ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 18
|
|
|
|
//******/ 0x75, 0x01, /* REPORT_SIZE (1) */ 20
|
|
|
|
//******/ 0x95, 0x08, /* REPORT_COUNT (8) */ 22
|
|
|
|
//******/ 0x81, 0x02, /* INPUT (Data,Var,Abs) */ 24
|
|
|
|
/* Reserved byte */
|
|
|
|
//******/ 0x95, 0x01, /* REPORT_COUNT (1) */ 26
|
|
|
|
//******/ 0x75, 0x08, /* REPORT_SIZE (8) */ 28
|
|
|
|
//******/ 0x81, 0x01, /* INPUT (Cnst,Ary,Abs) */ 30
|
|
|
|
/* LEDs for num lock etc */
|
|
|
|
//******/ 0x95, 0x05, /* REPORT_COUNT (5) */ 32
|
|
|
|
//******/ 0x75, 0x01, /* REPORT_SIZE (1) */ 34
|
|
|
|
//******/ 0x05, 0x08, /* USAGE_PAGE (LEDs) */ 36
|
|
|
|
//******/ 0x85, 0x01, /* REPORT_ID (1) */ 38
|
|
|
|
//******/ 0x19, 0x01, /* USAGE_MINIMUM (Num Lock) */ 40
|
|
|
|
//******/ 0x29, 0x05, /* USAGE_MAXIMUM (Kana) */ 42
|
|
|
|
//******/ 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ 44
|
|
|
|
/* Reserved 3 bits */
|
|
|
|
//******/ 0x95, 0x01, /* REPORT_COUNT (1) */ 46
|
|
|
|
//******/ 0x75, 0x03, /* REPORT_SIZE (3) */ 48
|
|
|
|
//******/ 0x91, 0x03, /* OUTPUT (Cnst,Var,Abs) */ 50
|
|
|
|
/* Slots for 6 keys that can be pressed down at the same time */
|
|
|
|
//******/ 0x95, 0x06, /* REPORT_COUNT (6) */ 52
|
|
|
|
//******/ 0x75, 0x08, /* REPORT_SIZE (8) */ 54
|
|
|
|
//******/ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 56
|
|
|
|
//******/ 0x25, 0x65, /* LOGICAL_MAXIMUM (101) */Bluegiga Technologies Oy 58
|
|
|
|
//******/ 0x05, 0x07, /* USAGE_PAGE (Keyboard) */ 60
|
|
|
|
//******/ 0x19, 0x00, /* USAGE_MINIMUM (Reserved (no event indicated)) */ 62
|
|
|
|
//******/ 0x29, 0x65, /* USAGE_MAXIMUM (Keyboard Application) */ 64
|
|
|
|
//******/ 0x81, 0x00, /* INPUT (Data,Ary,Abs) */ 66
|
|
|
|
//****/ 0xc0 } 67
|