1use kernel::utilities::registers::interfaces::Writeable;
41use kernel::utilities::registers::{register_bitfields, FieldValue, ReadWrite};
42use kernel::utilities::StaticRef;
43
44const PPI_BASE: StaticRef<PpiRegisters> =
45 unsafe { StaticRef::new(0x4001F000 as *const PpiRegisters) };
46
47#[repr(C)]
48struct PpiRegisters {
49 tasks_chg0_en: ReadWrite<u32, Control::Register>,
50 tasks_chg0_dis: ReadWrite<u32, Control::Register>,
51 tasks_chg1_en: ReadWrite<u32, Control::Register>,
52 tasks_chg1_dis: ReadWrite<u32, Control::Register>,
53 tasks_chg2_en: ReadWrite<u32, Control::Register>,
54 tasks_chg2_dis: ReadWrite<u32, Control::Register>,
55 tasks_chg3_en: ReadWrite<u32, Control::Register>,
56 tasks_chg3_dis: ReadWrite<u32, Control::Register>,
57 tasks_chg4_en: ReadWrite<u32, Control::Register>,
58 tasks_chg4_dis: ReadWrite<u32, Control::Register>,
59 tasks_chg5_en: ReadWrite<u32, Control::Register>,
60 tasks_chg5_dis: ReadWrite<u32, Control::Register>,
61 _reserved1: [u32; 308],
62 chen: ReadWrite<u32, Channel::Register>,
63 chenset: ReadWrite<u32, Channel::Register>,
64 chenclr: ReadWrite<u32, Channel::Register>,
65 ch0_eep: ReadWrite<u32, EventEndPoint::Register>,
66 ch0_tep: ReadWrite<u32, TaskEndPoint::Register>,
67 ch1_eep: ReadWrite<u32, EventEndPoint::Register>,
68 ch1_tep: ReadWrite<u32, TaskEndPoint::Register>,
69 ch2_eep: ReadWrite<u32, EventEndPoint::Register>,
70 ch2_tep: ReadWrite<u32, TaskEndPoint::Register>,
71 ch3_eep: ReadWrite<u32, EventEndPoint::Register>,
72 ch3_tep: ReadWrite<u32, TaskEndPoint::Register>,
73 ch4_eep: ReadWrite<u32, EventEndPoint::Register>,
74 ch4_tep: ReadWrite<u32, TaskEndPoint::Register>,
75 ch5_eep: ReadWrite<u32, EventEndPoint::Register>,
76 ch5_tep: ReadWrite<u32, TaskEndPoint::Register>,
77 ch6_eep: ReadWrite<u32, EventEndPoint::Register>,
78 ch6_tep: ReadWrite<u32, TaskEndPoint::Register>,
79 ch7_eep: ReadWrite<u32, EventEndPoint::Register>,
80 ch7_tep: ReadWrite<u32, TaskEndPoint::Register>,
81 ch8_eep: ReadWrite<u32, EventEndPoint::Register>,
82 ch8_tep: ReadWrite<u32, TaskEndPoint::Register>,
83 ch9_eep: ReadWrite<u32, EventEndPoint::Register>,
84 ch9_tep: ReadWrite<u32, TaskEndPoint::Register>,
85 ch10_eep: ReadWrite<u32, EventEndPoint::Register>,
86 ch10_tep: ReadWrite<u32, TaskEndPoint::Register>,
87 ch11_eep: ReadWrite<u32, EventEndPoint::Register>,
88 ch11_tep: ReadWrite<u32, TaskEndPoint::Register>,
89 ch12_eep: ReadWrite<u32, EventEndPoint::Register>,
90 ch12_tep: ReadWrite<u32, TaskEndPoint::Register>,
91 ch13_eep: ReadWrite<u32, EventEndPoint::Register>,
92 ch13_tep: ReadWrite<u32, TaskEndPoint::Register>,
93 ch14_eep: ReadWrite<u32, EventEndPoint::Register>,
94 ch14_tep: ReadWrite<u32, TaskEndPoint::Register>,
95 ch15_eep: ReadWrite<u32, EventEndPoint::Register>,
96 ch15_tep: ReadWrite<u32, TaskEndPoint::Register>,
97 ch16_eep: ReadWrite<u32, EventEndPoint::Register>,
98 ch16_tep: ReadWrite<u32, TaskEndPoint::Register>,
99 ch17_eep: ReadWrite<u32, EventEndPoint::Register>,
100 ch17_tep: ReadWrite<u32, TaskEndPoint::Register>,
101 ch18_eep: ReadWrite<u32, EventEndPoint::Register>,
102 ch18_tep: ReadWrite<u32, TaskEndPoint::Register>,
103 ch19_eep: ReadWrite<u32, EventEndPoint::Register>,
104 ch19_tep: ReadWrite<u32, TaskEndPoint::Register>,
105 _reserved2: [u32; 148],
106 chg: [ReadWrite<u32, Channel::Register>; 6],
107 _reserved3: [u32; 62],
108 fork_tep: [ReadWrite<u32, TaskEndPoint::Register>; 32],
109}
110
111register_bitfields! [u32,
112 Control [
113 ENABLE OFFSET(0) NUMBITS(1)
114 ],
115 pub Channel [
116 CH0 OFFSET(0) NUMBITS(1),
117 CH1 OFFSET(1) NUMBITS(1),
118 CH2 OFFSET(2) NUMBITS(1),
119 CH3 OFFSET(3) NUMBITS(1),
120 CH4 OFFSET(4) NUMBITS(1),
121 CH5 OFFSET(5) NUMBITS(1),
122 CH6 OFFSET(6) NUMBITS(1),
123 CH7 OFFSET(7) NUMBITS(1),
124 CH8 OFFSET(8) NUMBITS(1),
125 CH9 OFFSET(9) NUMBITS(1),
126 CH10 OFFSET(10) NUMBITS(1),
127 CH11 OFFSET(11) NUMBITS(1),
128 CH12 OFFSET(12) NUMBITS(1),
129 CH13 OFFSET(13) NUMBITS(1),
130 CH14 OFFSET(14) NUMBITS(1),
131 CH15 OFFSET(15) NUMBITS(1),
132 CH16 OFFSET(16) NUMBITS(1),
133 CH17 OFFSET(17) NUMBITS(1),
134 CH18 OFFSET(18) NUMBITS(1),
135 CH19 OFFSET(19) NUMBITS(1),
136 CH20 OFFSET(20) NUMBITS(1),
137 CH21 OFFSET(21) NUMBITS(1),
138 CH22 OFFSET(22) NUMBITS(1),
139 CH23 OFFSET(23) NUMBITS(1),
140 CH24 OFFSET(24) NUMBITS(1),
141 CH25 OFFSET(25) NUMBITS(1),
142 CH26 OFFSET(26) NUMBITS(1),
143 CH27 OFFSET(27) NUMBITS(1),
144 CH28 OFFSET(28) NUMBITS(1),
145 CH29 OFFSET(29) NUMBITS(1),
146 CH30 OFFSET(30) NUMBITS(1),
147 CH31 OFFSET(31) NUMBITS(1)
148 ],
149 TaskEndPoint [
150 ADDRESS OFFSET(0) NUMBITS(32)
151 ],
152 EventEndPoint [
153 ADDRESS OFFSET(0) NUMBITS(32)
154 ]
155];
156
157pub struct Ppi {
158 registers: StaticRef<PpiRegisters>,
159}
160
161impl Ppi {
162 pub const fn new() -> Ppi {
163 Ppi {
164 registers: PPI_BASE,
165 }
166 }
167
168 pub fn enable(&self, channels: FieldValue<u32, Channel::Register>) {
169 self.registers.chenset.write(channels);
170 }
171
172 pub fn disable(&self, channels: FieldValue<u32, Channel::Register>) {
173 self.registers.chenclr.write(channels);
174 }
175}