@@ -44,7 +44,14 @@ extern void __analogWriteFreq(uint32_t freq) {
4444}
4545
4646extern void __analogWrite (uint8_t pin, int val) {
47- analogWriteMode (pin, val, false );
47+ if (pin > 16 ) {
48+ return ;
49+ }
50+ bool openDrain = false ;
51+ if (analogMap & 1UL << pin) {
52+ openDrain = GPC (pin) & (1 << GPCD);
53+ }
54+ analogWriteMode (pin, val, openDrain);
4855}
4956
5057extern void __analogWriteMode (uint8_t pin, int val, bool openDrain) {
@@ -59,23 +66,22 @@ extern void __analogWriteMode(uint8_t pin, int val, bool openDrain) {
5966 }
6067
6168 if (analogMap & 1UL << pin) {
62- // Per the Arduino docs at https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/
63- // val: the duty cycle: between 0 (always off) and 255 (always on).
64- // So if val = 0 we have digitalWrite(LOW), if we have val==range we have digitalWrite(HIGH)
65-
6669 analogMap &= ~(1 << pin);
70+ const bool isOpenDrain = GPC (pin) & (1 << GPCD);
71+ if (isOpenDrain != openDrain) {
72+ GPC (pin) ^= (1 << GPCD);
73+ }
6774 }
6875 else {
69- if (openDrain) {
70- pinMode (pin, OUTPUT_OPEN_DRAIN);
71- } else {
72- pinMode (pin, OUTPUT);
73- }
76+ pinMode (pin, openDrain ? OUTPUT_OPEN_DRAIN : OUTPUT);
7477 }
7578 uint32_t high = (analogPeriod * val) / analogScale;
7679 uint32_t low = analogPeriod - high;
7780 // Find the first GPIO being generated by checking GCC's find-first-set (returns 1 + the bit of the first 1 in an int32_t)
7881 int phaseReference = __builtin_ffs (analogMap) - 1 ;
82+ // Per the Arduino docs at https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/
83+ // val: the duty cycle: between 0 (always off) and 255 (always on).
84+ // So if val = 0 we have digitalWrite(LOW), if we have val==range we have digitalWrite(HIGH)
7985 if (_setPWM (pin, val, analogScale)) {
8086 analogMap |= (1 << pin);
8187 } else if (startWaveformClockCycles (pin, high, low, 0 , phaseReference, 0 , true )) {
0 commit comments