The naming convention, the masks, the obfuscation... its complicated unnecessarily
as being a driver and dealing with different variations, there is no way of avoid the numbers in names. By masks well, I'm not a driver developer, so it is difficult to have an opinion on if it is the better problem solving way. Also semaphores are a harshness apart. It is very very specific.
I really doesn't like the standard conventions on C. As I only would use CAPITALIZED for constants. Even for macros I would use snake case like vars and functions. Upercase only for initials of namespacing ex: T8_arr_len()
Macros that doesn't behave as functions or values I prefer to avoid at all. And if they behave like functions there is no need to follow a different naming convention, even when polymorphic (the main use I did of function-like macros is for polymorphism on memory management on data structures).
I'm not a senior C, and I prefer to not take the boat of the traditional strangeness... :P