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