add hardware abstration layer so firwmware can be ported to other hardware without requiring any code changes