Skip to content

Commit 3423679

Browse files
committed
atmega2560: adc: Use custom MUX enum instead of relying on PAC
The previous code was based on the incorrect PAC enum which contained enumerated values which actually do not fit the field they were specified for. As those were removed in avr-device 0.3, this implmentation here also no longer compiles. Instead, use a similar approach to the atmega32u4-hal where a custom `AdcMux` enum is defined which we use to represent all supported MUX values in a compact way.
1 parent cbfa87b commit 3423679

File tree

1 file changed

+54
-25
lines changed
  • chips/atmega2560-hal/src

1 file changed

+54
-25
lines changed

chips/atmega2560-hal/src/adc.rs

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,59 @@ extern crate avr_hal_generic as avr_hal;
33
use crate::port::portf::{PF0, PF1, PF2, PF3, PF4, PF5, PF6, PF7};
44
use crate::port::portk::{PK0, PK1, PK2, PK3, PK4, PK5, PK6, PK7};
55

6-
use crate::pac::adc::admux::MUX_A;
6+
#[doc(hidden)]
7+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
8+
#[repr(u8)]
9+
pub enum AdcMux {
10+
Adc0 = 0b000000,
11+
Adc1 = 0b000001,
12+
Adc2 = 0b000010,
13+
Adc3 = 0b000011,
14+
Adc4 = 0b000100,
15+
Adc5 = 0b000101,
16+
Adc6 = 0b000110,
17+
Adc7 = 0b000111,
18+
19+
AdcVbg = 0b011110,
20+
AdcGnd = 0b011111,
21+
22+
Adc8 = 0b100000,
23+
Adc9 = 0b100001,
24+
Adc10 = 0b100010,
25+
Adc11 = 0b100011,
26+
Adc12 = 0b100100,
27+
Adc13 = 0b100101,
28+
Adc14 = 0b100110,
29+
Adc15 = 0b100111,
30+
}
731

832
avr_hal_generic::impl_adc! {
933
pub struct Adc {
10-
type ChannelID = MUX_A;
34+
type ChannelID = AdcMux;
1135
peripheral: crate::pac::ADC,
1236
set_mux: |peripheral, id| {
13-
peripheral.admux.modify(|_, w| w.mux().variant(id));
37+
let id = id as u8;
38+
peripheral.admux.modify(|_, w| w.mux().bits(id & 0x1F));
1439
// n.b. the high bit of ADMUX[MUX] is in the ADCSRB register
15-
peripheral.adcsrb.modify(|_, w| w.mux5().bit((id as u8) & 0b100000 != 0));
40+
peripheral.adcsrb.modify(|_, w| w.mux5().bit(id & 0x20 != 0));
1641
},
1742
pins: {
18-
pf0: (PF0, MUX_A::ADC0, didr0::adc0d),
19-
pf1: (PF1, MUX_A::ADC1, didr0::adc1d),
20-
pf2: (PF2, MUX_A::ADC2, didr0::adc2d),
21-
pf3: (PF3, MUX_A::ADC3, didr0::adc3d),
22-
pf4: (PF4, MUX_A::ADC4, didr0::adc4d),
23-
pf5: (PF5, MUX_A::ADC5, didr0::adc5d),
24-
pf6: (PF6, MUX_A::ADC6, didr0::adc6d),
25-
pf7: (PF7, MUX_A::ADC7, didr0::adc7d),
26-
pk0: (PK0, MUX_A::ADC8, didr2::adc8d),
27-
pk1: (PK1, MUX_A::ADC9, didr2::adc9d),
28-
pk2: (PK2, MUX_A::ADC10, didr2::adc10d),
29-
pk3: (PK3, MUX_A::ADC11, didr2::adc11d),
30-
pk4: (PK4, MUX_A::ADC12, didr2::adc12d),
31-
pk5: (PK5, MUX_A::ADC13, didr2::adc13d),
32-
pk6: (PK6, MUX_A::ADC14, didr2::adc14d),
33-
pk7: (PK7, MUX_A::ADC15, didr2::adc15d),
43+
pf0: (PF0, AdcMux::Adc0, didr0::adc0d),
44+
pf1: (PF1, AdcMux::Adc1, didr0::adc1d),
45+
pf2: (PF2, AdcMux::Adc2, didr0::adc2d),
46+
pf3: (PF3, AdcMux::Adc3, didr0::adc3d),
47+
pf4: (PF4, AdcMux::Adc4, didr0::adc4d),
48+
pf5: (PF5, AdcMux::Adc5, didr0::adc5d),
49+
pf6: (PF6, AdcMux::Adc6, didr0::adc6d),
50+
pf7: (PF7, AdcMux::Adc7, didr0::adc7d),
51+
pk0: (PK0, AdcMux::Adc8, didr2::adc8d),
52+
pk1: (PK1, AdcMux::Adc9, didr2::adc9d),
53+
pk2: (PK2, AdcMux::Adc10, didr2::adc10d),
54+
pk3: (PK3, AdcMux::Adc11, didr2::adc11d),
55+
pk4: (PK4, AdcMux::Adc12, didr2::adc12d),
56+
pk5: (PK5, AdcMux::Adc13, didr2::adc13d),
57+
pk6: (PK6, AdcMux::Adc14, didr2::adc14d),
58+
pk7: (PK7, AdcMux::Adc15, didr2::adc15d),
3459
}
3560
}
3661
}
@@ -39,20 +64,24 @@ avr_hal_generic::impl_adc! {
3964
///
4065
/// This module contains ADC channels, additional to the direct pin channels.
4166
pub mod channel {
67+
use super::AdcMux;
4268
use avr_hal_generic::hal::adc::Channel;
43-
use crate::pac::adc::admux::MUX_A;
4469

4570
/// Channel for the _Bandgap Reference Voltage_
4671
pub struct Vbg;
4772
impl Channel<super::Adc> for Vbg {
48-
type ID = MUX_A;
49-
fn channel() -> Self::ID { MUX_A::ADC_VBG }
73+
type ID = AdcMux;
74+
fn channel() -> Self::ID {
75+
AdcMux::AdcVbg
76+
}
5077
}
5178

5279
/// Channel for _GND_
5380
pub struct Gnd;
5481
impl Channel<super::Adc> for Gnd {
55-
type ID = MUX_A;
56-
fn channel() -> Self::ID { MUX_A::ADC_GND }
82+
type ID = AdcMux;
83+
fn channel() -> Self::ID {
84+
AdcMux::AdcGnd
85+
}
5786
}
5887
}

0 commit comments

Comments
 (0)