RocketLogger  1.1
pwm.c
Go to the documentation of this file.
1 
31 #include "pwm.h"
32 
34 int mem_fd;
36 volatile uint16_t* pwmss0_regs;
38 volatile uint16_t* pwmss1_regs;
39 
45 int pwm_setup(void) {
46 
47  // open /dev/mem for memory mapping
48  if ((mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) {
49  rl_log(ERROR, "can't open /dev/mem");
50  return FAILURE;
51  }
52 
53  // map pwm0 registers into virtual memory
54  pwmss0_regs =
55  (volatile uint16_t*)mmap(NULL, PWM_SIZE, PROT_READ | PROT_WRITE,
56  MAP_SHARED, mem_fd, PWMSS0_BASE);
57  if (pwmss1_regs == (volatile uint16_t*)MAP_FAILED) {
58  rl_log(ERROR, "mmap failed");
59  close(mem_fd);
60  return FAILURE;
61  }
62 
63  // map pwm1 registers into virtual memory
64  pwmss1_regs =
65  (volatile uint16_t*)mmap(NULL, PWM_SIZE, PROT_READ | PROT_WRITE,
66  MAP_SHARED, mem_fd, PWMSS1_BASE);
67  if (pwmss1_regs == (volatile uint16_t*)MAP_FAILED) {
68  rl_log(ERROR, "mmap failed");
69  close(mem_fd);
70  return FAILURE;
71  }
72 
73  return SUCCESS;
74 }
75 
79 void pwm_close(void) {
80 
81  // unmap memory
82  munmap((void*)pwmss0_regs, PWM_SIZE);
83  munmap((void*)pwmss1_regs, PWM_SIZE);
84 
85  // close /dev/mem
86  close(mem_fd);
87 }
88 
93 void pwm_setup_range_clock(int sample_rate) {
94 
95  int period = PWM_PERIOD_SCALE / sample_rate;
96 
97  // setup ehrpwm
99  TBCTL_DEFAULT | UP_DOWN_COUNT | PRESCALE2; // set clock mode
100 
101  pwmss1_regs[TBPRD] = period; // set clock period
102 
103  pwmss1_regs[CMPA] = (1 - PULSE_WIDTH / 2) *
104  period; // set compare registers for both output signals
105  pwmss1_regs[CMPB] = PULSE_WIDTH / 2 * period;
106 
107  pwmss1_regs[AQCTLA] = RWC_AQ_A; // set actions
109 }
110 
115 
116  // setup ehrpwm
119  pwmss0_regs[CMPA] = ADC_CLOCK_PERIOD / 2; // 50% duty
121 }
#define TBCTL_DEFAULT
Default counter value (see AM335x_TR)
Definition: pwm.h:74
#define TBPRD
Period register offset.
Definition: pwm.h:62
#define RWC_AQ_B
Action qualifier B value for latch reset (see AM335x_TR)
Definition: pwm.h:84
#define ADC_AQ
Action qualifier value for ADC clock (see AM335x_TR)
Definition: pwm.h:101
int mem_fd
Physical memory file descriptor.
Definition: pwm.c:34
#define FAILURE
Definition: types.h:77
#define SUCCESS
Definition: types.h:74
#define PRESCALE2
Counter prescale 2.
Definition: pwm.h:78
int pwm_setup(void)
Definition: pwm.c:45
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:38
#define PWMSS1_BASE
PWMSS1 register base address.
Definition: pwm.h:50
void pwm_setup_range_clock(int sample_rate)
Definition: pwm.c:93
#define TBCTL
Counter control register offset.
Definition: pwm.h:60
#define ADC_CLOCK_PERIOD
ADC master clock period in ns.
Definition: pwm.h:99
#define RWC_AQ_A
Action qualifier A value for latch reset (see AM335x_TR)
Definition: pwm.h:82
#define CMPB
Compare register B offset.
Definition: pwm.h:66
#define PWM_PERIOD_SCALE
Latch reset period scaling factor.
Definition: pwm.h:92
#define CMPA
Compare register A offset.
Definition: pwm.h:64
#define PWMSS0_BASE
PWMSS0 register base address.
Definition: pwm.h:48
Error.
Definition: types.h:199
#define AQCTLB
Action qualifier register B offset.
Definition: pwm.h:70
#define UP_DOWN_COUNT
Up-down counting.
Definition: pwm.h:76
#define PULSE_WIDTH
Latch reset pulse width (part of sampling period)
Definition: pwm.h:88
#define PWM_SIZE
Size of PWM register memory.
Definition: pwm.h:56
void pwm_setup_adc_clock(void)
Definition: pwm.c:114
void pwm_close(void)
Definition: pwm.c:79
volatile uint16_t * pwmss1_regs
Pointer to PWMSS1 (PWM-Sub-System) registers.
Definition: pwm.c:38
#define AQCTLA
Action qualifier register offset.
Definition: pwm.h:68
volatile uint16_t * pwmss0_regs
Pointer to PWMSS0 (PWM-Sub-System) registers.
Definition: pwm.c:36