RocketLogger  1.0
pwm.c
Go to the documentation of this file.
1 
5 #include "pwm.h"
6 
8 int mem_fd;
10 volatile uint16_t *pwmss0_regs;
12 volatile uint16_t *pwmss1_regs;
13 
18 int pwm_setup(void) {
19 
20  // open /dev/mem for memory mapping
21  if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
22  rl_log(ERROR, "can't open /dev/mem");
23  return FAILURE;
24  }
25 
26  // map pwm0 registers into virtual memory
27  pwmss0_regs = (volatile uint16_t *)mmap (NULL, PWM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, PWMSS0_BASE);
28  if (pwmss1_regs == (volatile uint16_t *)MAP_FAILED) {
29  rl_log(ERROR, "mmap failed");
30  close (mem_fd);
31  return FAILURE;
32  }
33 
34  // map pwm1 registers into virtual memory
35  pwmss1_regs = (volatile uint16_t *)mmap (NULL, PWM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, PWMSS1_BASE);
36  if (pwmss1_regs == (volatile uint16_t *)MAP_FAILED) {
37  rl_log(ERROR, "mmap failed");
38  close (mem_fd);
39  return FAILURE;
40  }
41 
42  return SUCCESS;
43 }
44 
48 void pwm_close(void) {
49 
50  // unmap memory
51  munmap((void *)pwmss0_regs, PWM_SIZE);
52  munmap((void *)pwmss1_regs, PWM_SIZE);
53 
54  // close /dev/mem
55  close (mem_fd);
56 
57 }
58 
59 
64 void range_clock_setup(int sample_rate) {
65 
66  int period = PWM_PERIOD_SCALE / sample_rate;
67 
68  // setup ehrpwm
69  pwmss1_regs[TBCTL] = TBCTL_DEFAULT | UP_DOWN_COUNT | PRESCALE2; // set clock mode
70 
71  pwmss1_regs[TBPRD] = period; // set clock period
72 
73  pwmss1_regs[CMPA] = (1 - PULSE_WIDTH/2) * period; // set compare registers for both output signals
74  pwmss1_regs[CMPB] = PULSE_WIDTH/2 * period;
75 
76  pwmss1_regs[AQCTLA] = RWC_AQ_A; // set actions
78 
79 }
80 
84 void adc_clock_setup(void) {
85 
86  // setup ehrpwm
89  pwmss0_regs[CMPA] = ADC_CLOCK_PERIOD/2; // 50% duty
91 
92 }
#define TBCTL_DEFAULT
Default counter value (see AM335x_TR)
Definition: pwm.h:45
void range_clock_setup(int sample_rate)
Definition: pwm.c:64
#define TBPRD
Period register offset.
Definition: pwm.h:33
#define RWC_AQ_B
Action qualifier B value for latch reset (see AM335x_TR)
Definition: pwm.h:56
#define ADC_AQ
Action qualifier value for ADC clock (see AM335x_TR)
Definition: pwm.h:71
int mem_fd
Physical memory file descriptor.
Definition: pwm.c:8
#define FAILURE
Definition: types.h:53
#define SUCCESS
Definition: types.h:50
#define PRESCALE2
Counter prescale 2.
Definition: pwm.h:49
int pwm_setup(void)
Definition: pwm.c:18
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:12
#define PWMSS1_BASE
PWMSS1 register base address.
Definition: pwm.h:21
#define TBCTL
Counter control register offset.
Definition: pwm.h:31
#define ADC_CLOCK_PERIOD
ADC master clock period in ns.
Definition: pwm.h:69
#define RWC_AQ_A
Action qualifier A value for latch reset (see AM335x_TR)
Definition: pwm.h:54
#define CMPB
Compare register B offset.
Definition: pwm.h:37
#define PWM_PERIOD_SCALE
Latch reset period scaling factor.
Definition: pwm.h:64
#define CMPA
Compare register A offset.
Definition: pwm.h:35
#define PWMSS0_BASE
PWMSS0 register base address.
Definition: pwm.h:19
Error.
Definition: types.h:167
#define AQCTLB
Action qualifier register B offset.
Definition: pwm.h:41
#define UP_DOWN_COUNT
Up-down counting.
Definition: pwm.h:47
#define PULSE_WIDTH
Latch reset pulse width (part of sampling period)
Definition: pwm.h:60
void adc_clock_setup(void)
Definition: pwm.c:84
#define PWM_SIZE
Size of PWM register memory.
Definition: pwm.h:27
void pwm_close(void)
Definition: pwm.c:48
volatile uint16_t * pwmss1_regs
Pointer to PWMSS1 (PWM-Sub-System) registers.
Definition: pwm.c:12
#define AQCTLA
Action qualifier register offset.
Definition: pwm.h:39
volatile uint16_t * pwmss0_regs
Pointer to PWMSS0 (PWM-Sub-System) registers.
Definition: pwm.c:10