<p>During implementation and review of <a class="issue-link js-issue-link" data-error-text="Failed to load issue title" data-id="488083376" data-permission-text="Issue title is private" data-url="https://github.com/RIOT-OS/RIOT/issues/12144" data-hovercard-type="pull_request" data-hovercard-url="/RIOT-OS/RIOT/pull/12144/hovercard" href="https://github.com/RIOT-OS/RIOT/pull/12144">#12144</a> <a class="user-mention" data-hovercard-type="user" data-hovercard-url="/hovercards?user_id=1301112" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/benpicco">@benpicco</a> and I came across an issue where the peripheral access layer headers of STM32 boards have been altered in order to accommodate the rest of the RIOT code. While this works, it has lead us to think that this is rather not the ideal implementation. Here's the actual conversation we had about it:</p>
<p>16:04          mrus > benpicco: that's why I asked for a review before, because I was unsure. However, changing the code would<br>
actually mean a crapload if #ifdefs across the stm32_common. Besides: Take a look at e.g. stm32l432xx.h.<br>
It was altered as well and is not in its original form. In fact it was altered in the exact same places<br>
to accomodate the code that utilizes it.<br>
16:05      benpicco > <g-emoji class="g-emoji" alias="sob" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/1f62d.png">😭</g-emoji><br>
16:06          mrus > so, if we do it in a clean manner (-> adjusting RIOT's stm32_common code) we should do it for <em>all</em><br>
16:06      benpicco > usually those ifdef parts can be capsuled nicely into inline functions<br>
16:06          mrus > otherwise the mixup might be more confusing in the end, because you could not tell which code was<br>
altered and which one was worked around.<br>
16:06      benpicco > I wasn't aware that the vendor files had been tampered with before<br>
16:08          mrus > wait, I might be wrong on the example I gave, that file looks untampered<br>
16:08          mrus > but I think I saw an example, one second<br>
16:09          mrus > no, sorry, I was right<br>
16:09          mrus > <a href="https://raw.githubusercontent.com/ARMmbed/mbed-os/master/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L4" rel="nofollow">https://raw.githubusercontent.com/ARMmbed/mbed-os/master/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L4</a><br>
16:10          mrus > search for IMR1<br>
16:10          mrus > you'll find it<br>
16:10      benpicco > but this is madness<br>
16:10          mrus > in the RIOT version:<br>
16:10          mrus >   __IO uint32_t IMR;<br>
16:10          mrus > it was altered from IMR1 to IMR, just the way I did.<br>
16:10      benpicco > it's pretending IMR2 would not exist<br>
16:12          mrus > I don't think RIOT's code uses IMR2 anywhere<br>
16:13      benpicco > It's stuff like this that makes adding new MCUs to RIOT so bothersome<br>
16:13      benpicco > if it had been done properly, IMR1 would be handled in the driver and all new MCUs that use that instead<br>
of IMR would just work<br>
16:13      benpicco > instead now we have to tamper with each new vendor file<br>
16:14          mrus > what's your suggestion?<br>
16:15      benpicco > restore the original vendor file and handle IMR1 properly<br>
16:15      benpicco > I mean you already had the code to handle it<br>
16:16          mrus > but the code was really just a #define. Shouldn't there be another mechanism that handles IMR1 and IMR2?<br>
16:16      benpicco > I would suspect they still work the same as IMR, just now that there are two of them<br>
16:17          mrus > but the second set won't be something that's just there for the thrill of it, is it? I mean.. they do<br>
serve a function.. but RIOT is simply not using it at the moment. No?<br>
16:19      benpicco > I didn't read the data sheet for this. I would suspect some pins are connected to IMR1 and some to IMR2<br>
16:19      benpicco > <a href="https://github.com/LonelyWolf/stm32/blob/master/stm32l4-template/periph/exti.c">https://github.com/LonelyWolf/stm32/blob/master/stm32l4-template/periph/exti.c</a><br>
16:20      benpicco > > // Initialize the EXTI lines(s) in range from 0 to 31 according to the specified parameters<br>
16:20      benpicco > -> EXTI1<br>
16:20      benpicco >  // Initialize the EXTI lines(s) in range from 32 to 39 according to the specified parameters<br>
16:20      benpicco > -> EXIT2<br>
16:21      benpicco > eerm I mean IMR1 & IMR2<br>
16:22          mrus > okay, here's a suggestion:<br>
16:26          mrus > Let's stick to the tampered source file for this commit - otherwise this is going to become madness -<br>
and open an issue about cleaning up this spill. Because as I've shown, it needs to be cleaned up in<br>
different places, not only for this board. However, this has to be a team effort, because I only have a<br>
handful of boards here (L412KB, L031K6, L432KC & L476RG). Maybe in that issue we can agree on code that<br>
16:26          mrus > we use throughout the project for this purpose (remember, there are things like<br>
<a class="commit-link" href="https://github.com/RIOT-OS/RIOT/commit/f24bc34f7baf6bd652219a979b649c6a9065c10d#diff-603a19db2b9474300ade60caf581c8"><tt>f24bc34</tt>#diff-603a19db2b9474300ade60caf581c8</a><br>
e0R79 as well) - and then I can offer to begin cleanup for the boards that I have here.<br>
16:26          mrus > wdyt?<br>
16:32      benpicco > well the child is already in the well for this one, so I guess if you don't volunteer for the cleanup,<br>
you can of course continue in the olden ways<br>
16:32      benpicco > btw: instead of #if defined(CPU_MODEL_STM32L412KB)<br>
16:33      benpicco > in common code, try using something like #if defined(TIM_CCR4_CCR4) when you want to use CCR4<br>
16:33      benpicco > so when adding a new MCU that also uses those registers, it will just work instead of throwing errors<br>
(or even worse, silently fail because no path is selected)<br>
16:34      benpicco > I know this is done elsewhere in RIOT too and I already tried to fix it for sam0<br>
16:35          mrus > I do volunteer for the cleanup, as I said above. I just don't think it makes sense to clean up only one<br>
newly implemented board but rather make it a team effort PR where we clean up all boards that require<br>
cleanup at once.</p>
<p>It probably makes sense to discuss this further in this issue and agree on how to proceed on this topic. The ideal outcome would be to be able to use the original headers provided by STM (without modifications), just like e.g. Zephyr uses them. I can imagine that it would also be nice it IMR2 would actually be functional. 🤷🏻‍♂️</p>
<p>I've put together a list of headers that <em>I believe</em> were altered. I didn't double-check it yet:</p>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32f3/include/vendor/stm32f302x8.h">stm32f302x8.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32f3/include/vendor/stm32f303x8.h">stm32f303x8.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32f3/include/vendor/stm32f303xc.h">stm32f303xc.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32f3/include/vendor/stm32f303xe.h">stm32f303xe.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32f3/include/vendor/stm32f334x8.h">stm32f334x8.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l412xx.h">stm32l412xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l432xx.h">stm32l432xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l433xx.h">stm32l433xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l452xx.h">stm32l452xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l475xx.h">stm32l475xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l476xx.h">stm32l476xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l496xx.h">stm32l496xx.h</a></li>
<li><a href="https://github.com/RIOT-OS/RIOT/blob/master/cpu/stm32l4/include/vendor/stm32l4r5xx.h">stm32l4r5xx.h</a></li>
<p>Wdyt? Feedback on this is appreciated!</p>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/RIOT-OS/RIOT/issues/12163?email_source=notifications&email_token=ABE7WYA3HSXJPZDEYV4XLJDQHZ22RA5CNFSM4ITHJXM2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4HJAIQYA">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/ABE7WYDOMVQS5SQAYZRPQJDQHZ22RANCNFSM4ITHJXMQ">mute the thread</a>.<img src="https://github.com/notifications/beacon/ABE7WYHHG62SXXS5SIEP7XTQHZ22RA5CNFSM4ITHJXM2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4HJAIQYA.gif" height="1" width="1" alt="" /></p>
<script type="application/ld+json">[
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/RIOT-OS/RIOT/issues/12163?email_source=notifications\u0026email_token=ABE7WYA3HSXJPZDEYV4XLJDQHZ22RA5CNFSM4ITHJXM2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4HJAIQYA",
"url": "https://github.com/RIOT-OS/RIOT/issues/12163?email_source=notifications\u0026email_token=ABE7WYA3HSXJPZDEYV4XLJDQHZ22RA5CNFSM4ITHJXM2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4HJAIQYA",
"name": "View Issue"
"description": "View this Issue on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"