2424#include "../../drv/pwm/pwm_ev3.h"
2525#include "../../drv/gpio/gpio_ev3.h"
2626
27- // This is the second 64K of the on-chip RAM
28- #define PRU1_SHARED_RAM_ADDR 0x80010000
29-
3027// This needs to match the interface expected by the PRU firmware
3128typedef struct shared_ram {
3229 uint8_t pwms [PBDRV_PWM_EV3_NUM_CHANNELS ];
3330} shared_ram ;
34- static volatile shared_ram * const pru1_shared_ram = ( volatile shared_ram * ) PRU1_SHARED_RAM_ADDR ;
31+ static volatile shared_ram pru1_shared_ram __attribute__(( section ( ".shared1" ))) ;
3532
3633static pbio_error_t pbdrv_pwm_tiam1808_set_duty (pbdrv_pwm_dev_t * dev , uint32_t ch , uint32_t value ) {
3734 // Blue not available.
3835 if (ch == PBDRV_LED_PWM_CHANNEL_INVALID ) {
3936 return PBIO_SUCCESS ;
4037 }
4138
42- pru1_shared_ram -> pwms [ch ] = value ;
39+ pru1_shared_ram . pwms [ch ] = value ;
4340 return PBIO_SUCCESS ;
4441}
4542
@@ -60,7 +57,7 @@ void pbdrv_pwm_tiam1808_init(pbdrv_pwm_dev_t *devs) {
6057 TimerEnable (SOC_TMR_0_REGS , TMR_TIMER34 , TMR_ENABLE_CONT );
6158
6259 // Clear shared command memory
63- memset ((void * )pru1_shared_ram , 0 , sizeof (shared_ram ));
60+ memset ((void * )& pru1_shared_ram , 0 , sizeof (shared_ram ));
6461
6562 // Enable PRU1 and load its firmware
6663 PSCModuleControl (SOC_PSC_0_REGS , HW_PSC_PRU , PSC_POWERDOMAIN_ALWAYS_ON , PSC_MDCTL_NEXT_ENABLE );
@@ -69,8 +66,8 @@ void pbdrv_pwm_tiam1808_init(pbdrv_pwm_dev_t *devs) {
6966 unsigned int * fw_start = (unsigned int * )& _pru1_start ;
7067 uint32_t fw_sz = & _pru1_end - & _pru1_start ;
7168 PRUSSDRVPruWriteMemory (PRUSS0_PRU1_IRAM , 0 , fw_start , fw_sz );
72- // Set constant table C30 to point to 0x80010000
73- PRUSSDRVPruSetCTable (1 , 30 , (PRU1_SHARED_RAM_ADDR >> 8 ) & 0xffff );
69+ // Set constant table C30 to point to shared memory
70+ PRUSSDRVPruSetCTable (1 , 30 , ((( uint32_t ) & pru1_shared_ram ) >> 8 ) & 0xffff );
7471 PRUSSDRVPruEnable (1 );
7572
7673 devs [0 ].funcs = & pbdrv_pwm_tiam1808_funcs ;
0 commit comments