На уровне железа - реализовано в низкоуровневой прошивке девайса или вообще аппаратно, в виде неперешиваемых микросхем. Например, трансивер USB, преобразующий пакет данных в битовое кодирование 8b/10b. Изменить сложно или невозможно.
На уровне софта - реализовано программно в драйвере или приложении, которое взаимодействует с устройством.
Например, копирование файла на USB флешку. Изменить легко - перекомпилить программу.
сорри, прочитал ваш вопрос как "изменить"
изучение на уровне софта - разобраться, как работать с этой фигнёй, чтобы уметь использовать самостоятельно, но не вникать во внутреннюю структуру работы, которая вам не обязательна для использования.
изучение на уровне железа - понять, как именно работает устройство, добраться до как можно более низкого уровня, чтобы смочь создать такую же штуку.
например, чтобы скопировать файл на USB флешку вам достаточно изучить работу с fopen(), fwrite(), fclose() - это уровень софта.
Чтоб понять как реально производится запись на USB флешку и создать свою USB флешку, нужно знать как работает NAND, что нужно для подключения и передачи по USB, какие там бывают типы пакетов, формат пакетов, вплоть до написания своей прошивки