Сами модули есть аппаратно зависимые и аппаратно независимые некий HAL
В качестве документации мы используем части тех же ТЗ на разработку модулей в которых прописаны все API вызываемых процедур.
Не светить код, это совсем не самоцель (мы не военная организация :) ) При жесткой декомпозиции проекта на модули, мы считаем, что API достаточно для использования модуля, а читать API проще легче и быстрее чем читать код исходного модуля. Кроме того маскируются частные случаи конкретной реализации и это позволяет делать проекты более независимыми от конкретных версий модулей.