Да пожалуйста, секрета в этом никакого нет:

HID_UsagePage(HID_USAGE_PAGE_GENERIC_DESKTOP),
HID_Usage(HID_USAGE_GENERIC_HATSWITCH),
HID_LogicalMin(0),
HID_PhysicalMin(0),
HID_LogicalMaxS(POV_MAX-1),
HID_PhysicalMaxS(315),
HID_Unit(0x14),
HID_ReportSize(8),
HID_ReportCount(1),
HID_Input(HID_Data | HID_Variable | HID_Absolute | HID_NullState)

Здесь однобайтовая хатка , при POV_MAX=8 - 8 ми позиционная, при POV_MAX=240 - аналоговая с шагом 1,5° (соответственно надо скорректировать HID_PhysicalMaxS(360), 0xFF - в обоих случаях считается нейтральным положением.
А по числу хаток дальше возможны варианты: 4 раза повторяем эту структуру либо повторяем в ней HID_Usage(HID_USAGE_GENERIC_HATSWITCH) - еще три раза и сотвественно тогда HID_ReportCount(4). Первый вариант больше подходит для динамического формирования HID-репорта, второй - для статического задания.
В NJoy32 используется динамический способ, который позволяет задать количество указателей POV (0-4) самим пользователем в три клика мышки.
Разумеется можно задать размер данных и не один, а два байта , и получить не 240 отсчетов, а вплоть до 36000 - но пока это можно только увидеть в тестовой программе.

Минимумы в принципе можно и не обьявлять, если ранее были заданы нули.