Skip to content

Commit 1e312f1

Browse files
author
ReclaimerLabs
committed
Stability upgrades
Migrated to Microchip Studio (formerly Atmel Studio), I2C to 1 MHz, SPI uses DMA, Power Delivery code doesn't send Get_Source_Cap messages, screen update code optimized to bring response times in line with USB PD Spec, and other minor upgrades.
1 parent f463301 commit 1e312f1

File tree

21 files changed

+2151
-214
lines changed

21 files changed

+2151
-214
lines changed
11.5 KB
Binary file not shown.

firmware/USB-C Explorer/USB-C Explorer/USB-C Explorer.cproj

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@
3333
<option id="common.services.ioport" value="Add" config="" content-id="Atmel.ASF" />
3434
<option id="common.services.usb.class.device" value="Add" config="cdc" content-id="Atmel.ASF" />
3535
<option id="common2.components.display.ssd1306" value="Add" config="" content-id="Atmel.ASF" />
36+
<option id="sam0.drivers.dma" value="Add" config="" content-id="Atmel.ASF" />
37+
<option id="sam0.drivers.rtc" value="Add" config="count_callback" content-id="Atmel.ASF" />
3638
<option id="sam0.drivers.sercom.i2c.master" value="Add" config="polled" content-id="Atmel.ASF" />
3739
<option id="sam0.drivers.sercom.spi" value="Add" config="callback" content-id="Atmel.ASF" />
3840
<option id="sam0.drivers.system" value="Add" config="" content-id="Atmel.ASF" />
3941
<option id="sam0.drivers.system.clock" value="Add" config="" content-id="Atmel.ASF" />
42+
<option id="sam0.drivers.tc" value="Add" config="callback" content-id="Atmel.ASF" />
4043
<option id="qtlib.generic.tmx.qt.at91samd.device" value="Add" config="" content-id="f23f3c19-f15d-491d-bc53-a449fb4910a2" />
4144
<option id="libsamd21_qtouch_gcc.a" value="Add" config="" content-id="f23f3c19-f15d-491d-bc53-a449fb4910a2" />
42-
<option id="sam0.drivers.tc" value="Add" config="callback" content-id="Atmel.ASF" />
4345
<option id="sam0.utils.linker_scripts" value="Add" config="" content-id="Atmel.ASF" />
4446
</options>
4547
<configurations>
@@ -223,11 +225,11 @@
223225
<file path="src/ASF/sam0/drivers/events/events_hooks.c" framework="" version="3.35.1" source="sam0\drivers\events\events_hooks.c" changed="False" content-id="Atmel.ASF" />
224226
<file path="src/ASF/sam0/drivers/events/events_common.h" framework="" version="3.35.1" source="sam0\drivers\events\events_common.h" changed="False" content-id="Atmel.ASF" />
225227
<file path="src/ASF/sam0/drivers/events/events_hooks.h" framework="" version="3.35.1" source="sam0\drivers\events\events_hooks.h" changed="False" content-id="Atmel.ASF" />
226-
<file path="src/ASF/sam0/drivers/rtc/rtc_count.h" framework="" version="3.35.1" source="sam0\drivers\rtc\rtc_count.h" changed="False" content-id="Atmel.ASF" />
227-
<file path="src/ASF/sam0/drivers/rtc/rtc_count_interrupt.h" framework="" version="3.35.1" source="sam0\drivers\rtc\rtc_count_interrupt.h" changed="False" content-id="Atmel.ASF" />
228-
<file path="src/ASF/sam0/drivers/rtc/rtc_tamper.h" framework="" version="3.35.1" source="sam0\drivers\rtc\rtc_tamper.h" changed="False" content-id="Atmel.ASF" />
229-
<file path="src/ASF/sam0/drivers/rtc/rtc_sam_d_r_h/rtc_count.c" framework="" version="3.35.1" source="sam0\drivers\rtc\rtc_sam_d_r_h\rtc_count.c" changed="False" content-id="Atmel.ASF" />
230-
<file path="src/ASF/sam0/drivers/rtc/rtc_sam_d_r_h/rtc_count_interrupt.c" framework="" version="3.35.1" source="sam0\drivers\rtc\rtc_sam_d_r_h\rtc_count_interrupt.c" changed="False" content-id="Atmel.ASF" />
228+
<file path="src/ASF/sam0/drivers/rtc/rtc_count.h" framework="" version="3.42.0" source="sam0\drivers\rtc\rtc_count.h" changed="False" content-id="Atmel.ASF" />
229+
<file path="src/ASF/sam0/drivers/rtc/rtc_count_interrupt.h" framework="" version="3.42.0" source="sam0\drivers\rtc\rtc_count_interrupt.h" changed="False" content-id="Atmel.ASF" />
230+
<file path="src/ASF/sam0/drivers/rtc/rtc_tamper.h" framework="" version="3.42.0" source="sam0\drivers\rtc\rtc_tamper.h" changed="False" content-id="Atmel.ASF" />
231+
<file path="src/ASF/sam0/drivers/rtc/rtc_sam_d_r_h/rtc_count.c" framework="" version="3.42.0" source="sam0\drivers\rtc\rtc_sam_d_r_h\rtc_count.c" changed="False" content-id="Atmel.ASF" />
232+
<file path="src/ASF/sam0/drivers/rtc/rtc_sam_d_r_h/rtc_count_interrupt.c" framework="" version="3.42.0" source="sam0\drivers\rtc\rtc_sam_d_r_h\rtc_count_interrupt.c" changed="False" content-id="Atmel.ASF" />
231233
<file path="src/QTouch/QDebugTransport.c" framework="" version="5.9" source="thirdparty\qtouch\devspecific\sam\samd\qdebug\QDebugTransport.c" changed="False" content-id="f23f3c19-f15d-491d-bc53-a449fb4910a2" />
232234
<file path="src/QTouch/BitBangSPI_Master.c" framework="" version="5.9" source="thirdparty\qtouch\devspecific\sam\samd\qdebug\BitBangSPI_Master.c" changed="False" content-id="f23f3c19-f15d-491d-bc53-a449fb4910a2" />
233235
<file path="src/QTouch/QDebug_samd.c" framework="" version="5.9" source="thirdparty\qtouch\devspecific\sam\samd\qdebug\QDebug_samd.c" changed="False" content-id="f23f3c19-f15d-491d-bc53-a449fb4910a2" />
@@ -295,11 +297,16 @@
295297
<file path="src/ASF/sam0/drivers/tc/tc_interrupt.h" framework="" version="3.35.1" source="sam0\drivers\tc\tc_interrupt.h" changed="False" content-id="Atmel.ASF" />
296298
<file path="src/ASF/sam0/drivers/tc/tc.h" framework="" version="3.35.1" source="sam0\drivers\tc\tc.h" changed="False" content-id="Atmel.ASF" />
297299
<file path="src/ASF/sam0/drivers/tc/tc_sam_d_r_h/tc.c" framework="" version="3.35.1" source="sam0\drivers\tc\tc_sam_d_r_h\tc.c" changed="False" content-id="Atmel.ASF" />
300+
<file path="src/ASF/sam0/drivers/dma/dma.c" framework="" version="3.42.0" source="sam0\drivers\dma\dma.c" changed="False" content-id="Atmel.ASF" />
301+
<file path="src/ASF/sam0/drivers/dma/dma_crc.h" framework="" version="3.42.0" source="sam0\drivers\dma\dma_crc.h" changed="False" content-id="Atmel.ASF" />
302+
<file path="src/ASF/sam0/drivers/dma/quick_start/qs_dma_basic.h" framework="" version="3.42.0" source="sam0\drivers\dma\quick_start\qs_dma_basic.h" changed="False" content-id="Atmel.ASF" />
303+
<file path="src/ASF/sam0/drivers/dma/dma.h" framework="" version="3.42.0" source="sam0\drivers\dma\dma.h" changed="False" content-id="Atmel.ASF" />
304+
<file path="src/Config/conf_dma.h" framework="" version="3.42.0" source="sam0\drivers\dma\module_config\conf_dma.h" changed="False" content-id="Atmel.ASF" />
298305
</files>
299306
<documentation help="http://asf.atmel.com/docs/3.30.1/common.applications.user_application.sam0_system.user_board.atsamd21e17a/html/index.html" />
300307
<offline-documentation help="" />
301308
<dependencies>
302-
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.35.1" />
309+
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.42.0" />
303310
<content-extension eid="f23f3c19-f15d-491d-bc53-a449fb4910a2" uuidref="f23f3c19-f15d-491d-bc53-a449fb4910a2" version="5.9" />
304311
</dependencies>
305312
<project id="common.applications.user_application.sam0_system.user_board.atsamd21e17a" value="Add" config="" content-id="Atmel.ASF" />
@@ -404,9 +411,10 @@
404411
<Value>../src/FUSB302</Value>
405412
<Value>../src/USBC_PD</Value>
406413
<Value>../src/USBC_TCPM</Value>
414+
<Value>../src/ASF/sam0/drivers/dma</Value>
407415
</ListValues>
408416
</armgcc.compiler.directories.IncludePaths>
409-
<armgcc.compiler.optimization.level>Optimize for size (-Os)</armgcc.compiler.optimization.level>
417+
<armgcc.compiler.optimization.level>Optimize most (-O3)</armgcc.compiler.optimization.level>
410418
<armgcc.compiler.optimization.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags>
411419
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
412420
<armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings>
@@ -483,6 +491,7 @@
483491
<Value>../src/ASF/sam0/drivers/sercom/i2c/i2c_sam0</Value>
484492
<Value>../src/ASF/sam0/drivers/tc</Value>
485493
<Value>../src/ASF/sam0/drivers/tc/tc_sam_d_r_h</Value>
494+
<Value>../src/ASF/sam0/drivers/dma</Value>
486495
</ListValues>
487496
</armgcc.assembler.general.IncludePaths>
488497
<armgcc.preprocessingassembler.general.AssemblerFlags>-DARM_MATH_CM0PLUS=true -DBOARD=USER_BOARD -DSYSTICK_MODE -DEVENTS_INTERRUPT_HOOKS_MODE=true -DRTC_COUNT_ASYNC=true -DUSB_DEVICE_LPM_SUPPORT -DUDD_ENABLE -DEXTINT_CALLBACK_MODE=true -DSPI_CALLBACK_MODE=true -DI2C_MASTER_CALLBACK_MODE=false -DTC_ASYNC=true</armgcc.preprocessingassembler.general.AssemblerFlags>
@@ -536,6 +545,7 @@
536545
<Value>../src/ASF/sam0/drivers/sercom/i2c/i2c_sam0</Value>
537546
<Value>../src/ASF/sam0/drivers/tc</Value>
538547
<Value>../src/ASF/sam0/drivers/tc/tc_sam_d_r_h</Value>
548+
<Value>../src/ASF/sam0/drivers/dma</Value>
539549
</ListValues>
540550
</armgcc.preprocessingassembler.general.IncludePaths>
541551
</ArmGcc>
@@ -620,6 +630,7 @@
620630
<Value>../src/USBC_TCPM</Value>
621631
<Value>../src/ASF/sam0/drivers/tc</Value>
622632
<Value>../src/ASF/sam0/drivers/tc/tc_sam_d_r_h</Value>
633+
<Value>../src/ASF/sam0/drivers/dma</Value>
623634
</ListValues>
624635
</armgcc.compiler.directories.IncludePaths>
625636
<armgcc.compiler.optimization.level>Optimize debugging experience (-Og)</armgcc.compiler.optimization.level>
@@ -695,6 +706,7 @@
695706
<Value>../src/ASF/sam0/drivers/sercom/i2c/i2c_sam0</Value>
696707
<Value>../src/ASF/sam0/drivers/tc</Value>
697708
<Value>../src/ASF/sam0/drivers/tc/tc_sam_d_r_h</Value>
709+
<Value>../src/ASF/sam0/drivers/dma</Value>
698710
</ListValues>
699711
</armgcc.assembler.general.IncludePaths>
700712
<armgcc.assembler.debugging.DebugLevel>Default (-g)</armgcc.assembler.debugging.DebugLevel>
@@ -749,6 +761,7 @@
749761
<Value>../src/ASF/sam0/drivers/sercom/i2c/i2c_sam0</Value>
750762
<Value>../src/ASF/sam0/drivers/tc</Value>
751763
<Value>../src/ASF/sam0/drivers/tc/tc_sam_d_r_h</Value>
764+
<Value>../src/ASF/sam0/drivers/dma</Value>
752765
</ListValues>
753766
</armgcc.preprocessingassembler.general.IncludePaths>
754767
<armgcc.preprocessingassembler.debugging.DebugLevel>Default (-Wa,-g)</armgcc.preprocessingassembler.debugging.DebugLevel>
@@ -765,7 +778,7 @@
765778
<SubType>compile</SubType>
766779
</None>
767780
<None Include="USB-C Explorer.qtdgn">
768-
<SubType>none</SubType>
781+
<SubType>compile</SubType>
769782
<Generator>QTouchFileGenerator</Generator>
770783
</None>
771784
<None Include="src\ASF\sam0\utils\linker_scripts\samd21\gcc\samd21e17a_flash.ld">
@@ -857,6 +870,18 @@
857870
<None Include="src\ASF\sam0\drivers\extint\extint.h">
858871
<SubType>compile</SubType>
859872
</None>
873+
<Compile Include="src\ASF\sam0\drivers\dma\dma.c">
874+
<SubType>compile</SubType>
875+
</Compile>
876+
<None Include="src\ASF\sam0\drivers\dma\dma_crc.h">
877+
<SubType>compile</SubType>
878+
</None>
879+
<None Include="src\ASF\sam0\drivers\dma\quick_start\qs_dma_basic.h">
880+
<SubType>compile</SubType>
881+
</None>
882+
<None Include="src\ASF\sam0\drivers\dma\dma.h">
883+
<SubType>compile</SubType>
884+
</None>
860885
<Compile Include="src\ASF\sam0\drivers\extint\extint_callback.c">
861886
<SubType>compile</SubType>
862887
</Compile>
@@ -971,6 +996,9 @@
971996
<None Include="src\config\conf_spi.h">
972997
<SubType>compile</SubType>
973998
</None>
999+
<None Include="src\config\conf_dma.h">
1000+
<SubType>compile</SubType>
1001+
</None>
9741002
<Compile Include="src\FUSB302\FUSB302.c">
9751003
<SubType>compile</SubType>
9761004
</Compile>
@@ -1575,6 +1603,8 @@
15751603
<Folder Include="src\ASF\common\utils\interrupt\" />
15761604
<Folder Include="src\ASF\sam0\" />
15771605
<Folder Include="src\ASF\sam0\drivers\" />
1606+
<Folder Include="src\ASF\sam0\drivers\dma\" />
1607+
<Folder Include="src\ASF\sam0\drivers\dma\quick_start\" />
15781608
<Folder Include="src\ASF\sam0\drivers\events\" />
15791609
<Folder Include="src\ASF\sam0\drivers\events\events_sam_d_r_h\" />
15801610
<Folder Include="src\ASF\sam0\drivers\extint\" />

firmware/USB-C Explorer/USB-C Explorer/main.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@
5252
* Atmel Software Framework (ASF).
5353
*/
5454
#include <asf.h>
55+
// This should be included in asf.h,
56+
// but something went wrong moving to Microchip Studio
57+
#include "touch_api_ptc.h"
5558
#include "ugui.h"
5659
#include "tcpm_driver.h"
5760
#include "usb_pd_driver.h"
@@ -75,6 +78,9 @@ uint32_t device_rev = 0;
7578
const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = {
7679
{&i2c_master_instance, fusb302_I2C_SLAVE_ADDR, &fusb302_tcpm_drv},
7780
};
81+
82+
int pd_count=0, pd_count_written=0;
83+
uint32_t *pd_src_caps;
7884
// USB-C Specific - TCPM end 1
7985

8086
volatile uint8_t display_screen, display_needs_update, display_change_requested;
@@ -231,8 +237,6 @@ int main(void)
231237
tcpc_alert(0);
232238
}
233239

234-
pd_run_state_machine(0);
235-
236240
if (display_change_requested)
237241
{
238242
if (display_screen >= (MAX_SCREENS - 1))
@@ -252,8 +256,24 @@ int main(void)
252256
ssd1306_write_data_n(display_buffer[display_screen], DISP_MEM_SIZE);
253257
display_needs_update = 0;
254258
}
259+
260+
// This is set so as not to needlessly spam the I2C bus
261+
delay_us(1000);
255262

256-
delay_ms(2);
263+
// See the notes in pd_process_source_cap_callback()
264+
if (pd_count_written < pd_count)
265+
{
266+
char str[256];
267+
uint32_t ma, mv, pdo;
268+
269+
pd_extract_pdo_power(pd_src_caps[pd_count_written], &ma, &mv);
270+
sprintf(str, "%5.2f V, %5.2f A", (float)mv/1000, (float)ma/1000);
271+
UG_PutString(0, 8*(pd_count_written+2), str);
272+
pd_count_written++;
273+
display_needs_update = 1;
274+
}
275+
276+
pd_run_state_machine(0);
257277
}
258278
}
259279

@@ -362,7 +382,7 @@ void i2c_init(void)
362382
struct i2c_master_config config_i2c_master;
363383
i2c_master_get_config_defaults(&config_i2c_master);
364384
config_i2c_master.buffer_timeout = 10000;
365-
config_i2c_master.baud_rate = I2C_MASTER_BAUD_RATE_400KHZ;
385+
config_i2c_master.baud_rate = I2C_MASTER_BAUD_RATE_1000KHZ;
366386
config_i2c_master.pinmux_pad0 = I2C_SDA_PINMUX;
367387
config_i2c_master.pinmux_pad1 = I2C_SCL_PINMUX;
368388
i2c_master_init(&i2c_master_instance, I2C_MODULE, &config_i2c_master);

firmware/USB-C Explorer/USB-C Explorer/src/ASF/common2/components/display/ssd1306/ssd1306.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,18 @@
4444
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
4545
*/
4646
#include "ssd1306.h"
47+
#include <asf.h>
4748

4849
struct spi_module ssd1306_master;
4950
struct spi_slave_inst ssd1306_slave;
51+
struct dma_resource ssd1306_dma_resource_tx;
52+
COMPILER_ALIGNED(16)
53+
DmacDescriptor dma_descriptor_tx SECTION_DMAC_DESCRIPTOR;
54+
55+
static void ssd1306_write_data_callback(struct dma_resource* const resource)
56+
{
57+
spi_select_slave(&ssd1306_master, &ssd1306_slave, false);
58+
}
5059

5160
/**
5261
* \internal
@@ -75,6 +84,12 @@ static void ssd1306_interface_init(void)
7584

7685
spi_init(&ssd1306_master, SSD1306_SPI, &config);
7786
spi_enable(&ssd1306_master);
87+
88+
struct dma_resource_config tx_config;
89+
dma_get_config_defaults(&tx_config);
90+
tx_config.peripheral_trigger = CONF_PERIPHERAL_TRIGGER_TX;
91+
tx_config.trigger_action = DMA_TRIGGER_ACTION_BEAT;
92+
dma_allocate(&ssd1306_dma_resource_tx, &tx_config);
7893

7994
struct port_config pin;
8095
port_get_config_defaults(&pin);
@@ -185,9 +200,27 @@ void ssd1306_write_data(uint8_t data)
185200
}
186201

187202
void ssd1306_write_data_n(uint8_t *data, uint16_t size)
188-
{
203+
{
189204
spi_select_slave(&ssd1306_master, &ssd1306_slave, true);
190205
port_pin_set_output_level(SSD1306_DC_PIN, true);
191-
spi_write_buffer_wait(&ssd1306_master, data, size);
192-
spi_select_slave(&ssd1306_master, &ssd1306_slave, false);
206+
207+
//spi_write_buffer_wait(&ssd1306_master, data, size);
208+
//spi_write_buffer_job(&ssd1306_master, data, size);
209+
//spi_select_slave(&ssd1306_master, &ssd1306_slave, false);
210+
211+
struct dma_descriptor_config tx_descriptor_config;
212+
dma_descriptor_get_config_defaults(&tx_descriptor_config);
213+
tx_descriptor_config.beat_size = DMA_BEAT_SIZE_BYTE;
214+
tx_descriptor_config.dst_increment_enable = false;
215+
tx_descriptor_config.block_transfer_count = size;
216+
tx_descriptor_config.source_address = (uint32_t)data + (uint32_t)size;
217+
tx_descriptor_config.destination_address = (uint32_t)(&ssd1306_master.hw->SPI.DATA.reg);
218+
dma_descriptor_create(&dma_descriptor_tx, &tx_descriptor_config);
219+
220+
dma_add_descriptor(&ssd1306_dma_resource_tx, &dma_descriptor_tx);
221+
222+
dma_register_callback(&ssd1306_dma_resource_tx, ssd1306_write_data_callback, DMA_CALLBACK_TRANSFER_DONE);
223+
dma_enable_callback(&ssd1306_dma_resource_tx, DMA_CALLBACK_TRANSFER_DONE);
224+
225+
dma_start_transfer_job(&ssd1306_dma_resource_tx);
193226
}

firmware/USB-C Explorer/USB-C Explorer/src/ASF/common2/components/display/ssd1306/ssd1306.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ void ssd1306_write_data(uint8_t data);
163163

164164
void ssd1306_write_data_n(uint8_t *data, uint16_t size);
165165

166+
//static void ssd1306_write_data_callback(struct dma_resource* const resource);
167+
166168
/**
167169
* \brief Read data from the controller
168170
*

0 commit comments

Comments
 (0)