@@ -20,7 +20,11 @@ module pmod_i2c_master #(
2020 , parameter LED_CFG = " drivers/pca9635-cfg.hex"
2121 , parameter LED_CFG_BYTES = 16'd26
2222`ifdef TOUCH_SENSE_ENABLED
23+ `ifdef HW_R35
24+ , parameter TOUCH_CFG = " drivers/cy8cmbr3108-cfg-r35.hex"
25+ `else
2326 , parameter TOUCH_CFG = " drivers/cy8cmbr3108-cfg.hex"
27+ `endif
2428 , parameter TOUCH_CFG_BYTES = 16'd130 // 0x80 + 2
2529`endif
2630)(
@@ -89,8 +93,13 @@ localparam I2C_DELAY1 = 0,
8993`ifdef COCOTB_SIM
9094localparam STARTUP_DELAY_BIT = 4 ;
9195`else
96+ `ifdef HW_R35
97+ // HW R3.5 requires longer startup delay (~1.5s due to reset supervisor chip)
98+ localparam STARTUP_DELAY_BIT = 24 ;
99+ `else
92100localparam STARTUP_DELAY_BIT = 17 ;
93101`endif
102+ `endif
94103
95104logic [3 : 0 ] i2c_state = I2C_DELAY1 ;
96105
@@ -135,7 +144,7 @@ logic err_out;
135144logic ready;
136145
137146// Used for startup delay.
138- logic [23 : 0 ] delay_cnt;
147+ logic [24 : 0 ] delay_cnt;
139148
140149// **Used for indicating POR failure of touch IC.**
141150// Mitigation for `issues/59`: if CS2 of touch sense IC is shorted to ground
@@ -210,6 +219,8 @@ always_ff @(posedge clk) begin
210219 cmd <= I2CMASTER_STOP ;
211220`ifdef HW_R33
212221 i2c_state <= I2C_INIT_TOUCH1 ;
222+ `elsif HW_R35
223+ i2c_state <= I2C_INIT_TOUCH1 ;
213224`else
214225 // For R31, don't try initializing touch sense
215226 i2c_state <= I2C_INIT_CODEC1 ;
@@ -554,16 +565,29 @@ always_ff @(posedge clk) begin
554565 i2c_state <= I2C_LED1 ;
555566 cmd <= I2CMASTER_STOP ;
556567 end else begin
568+ `ifdef HW_R35
569+ case (nsensor)
570+ 0 : data_in <= 8'hC4 ;
571+ 1 : data_in <= 8'hC8 ;
572+ 2 : data_in <= 8'hCA ;
573+ 3 : data_in <= 8'hCC ;
574+ 4 : data_in <= 8'hCE ;
575+ 5 : data_in <= 8'hD0 ;
576+ 6 : data_in <= 8'hD2 ;
577+ 7 : data_in <= 8'hD4 ;
578+ endcase
579+ `else
557580 case (nsensor)
558581 0 : data_in <= 8'hBA ;
559582 1 : data_in <= 8'hBC ;
560583 2 : data_in <= 8'hBE ;
561584 3 : data_in <= 8'hC0 ;
562- 4 : data_in <= 8'hC2 ;
563- 5 : data_in <= 8'hC4 ;
564- 6 : data_in <= 8'hC6 ;
565- 7 : data_in <= 8'hC8 ;
585+ 4 : data_in <= 8'hC8 ;
586+ 5 : data_in <= 8'hC6 ;
587+ 6 : data_in <= 8'hC4 ;
588+ 7 : data_in <= 8'hC2 ;
566589 endcase
590+ `endif
567591 end
568592 end
569593 3 : cmd <= I2CMASTER_STOP ;
@@ -589,11 +613,10 @@ always_ff @(posedge clk) begin
589613 1 : touch1 <= data_out;
590614 2 : touch2 <= data_out;
591615 3 : touch3 <= data_out;
592- // R3.3 hw swaps last four vs R3.2 to improve PCB routing
593- 4 : touch7 <= data_out;
594- 5 : touch6 <= data_out;
595- 6 : touch5 <= data_out;
596- 7 : touch4 <= data_out;
616+ 4 : touch4 <= data_out;
617+ 5 : touch5 <= data_out;
618+ 6 : touch6 <= data_out;
619+ 7 : touch7 <= data_out;
597620 endcase
598621 cmd <= I2CMASTER_STOP ;
599622 i2c_state <= I2C_LED1 ;
0 commit comments