Увы, как программист с SL811 я конкретно не работал, просто лет 10 назад разрабатывал c ним платформу (тогда еще не было недорогих контроллеров со встроенным хостом), потом программисты туда Линукс прикрутили. Но я разрабатываю сейчас свой стек USB-хоста (увы, коммерческий, портируемый), могу немножко посоветовать как решать Вашу задачу.

1. Сначала надо разработать процедуру которая определяет что подключено внешнее устройство, и какой скорости - FS/LS
2. Потом выполнить сброс шины USB (сброс порта/корневого хаба)
3. Написать код для выполнения транзакций Control на EP0
4. Прочитать с помощью этого кода дескрипторы подключенного устройства, достаточно обычно только дескриптора конфигурации
5. С помощью того же кода транзакций Control EP0 назначить адрес устройству, назначить конфигурацию (номер взять из разбора дескриптора)
6. Разобрать дескриптор конфигурации, определить номер interrupt EP. по которой HID устройство будет слать отчеты (reports) о своем состоянии
7. Запустить периодический IN на эту interrupt EP
8. Там при нажатии/отпускании клавиш буду приходить HID-reports - 8 байтовые пакеты.
9. Уже из этих пакетов вытащить скан-коды и признаки клавиш-модификаторов.

Ну как то так, если с нуля то разбираться не очень быстро (
Если будут какие-то конкретные вопросы - не стесняйтесь, задавайте.
Стандарт USB стоит взять описание версии 1.1 (легко гуглится), потому что версия 2.0 сильно больше по объему и там много новшеств, которые на начальном этапе можно смело пропустить.

Как вариант софта - можно еще посмореть на www.st.com библиотеку и пример подключения клавиатуры к STM32. Кода для SL811 там конечно не найти, но общую/верхнюю часть стека - вполне.

Есть еще такая книжка - USB Mass Storage Designing and Programming Devices and Embedded Hosts, имхо, для начала неплохо подходит.
На русском языке есть книжка Павла Агурова "Интерфейс USB. Практика использования и программирования", но, на мой взгляд сильно занудно и заумно написанане она не очень нравится.