EmbeddedRelated.com
Forums
The 2025 Embedded Online Conference

Adding the new "USB CUSTOM CLASS" template to CubeMX for STM32?

Started by Wojciech Zabolotny October 5, 2020
When preparing nonstandard USB firmwares for STM32 microcontrollers, it would be perfect to have a possibility to use a "CUSTOM CLASS", in "Class for FS IP" list in CubeMX.
Unfortunately it is not available.
I have taken a look into CubeMX, and have found that for example the CUSTOM HID class is implemented in the following way:

In the USB_DEVICE_-STM32???_Configs.xml file there are the following sections:

    <!-- Custom HID Class -->    
    <RefConfig Comment="CUSTOMHID" Name="USB_DEVICE_CUSTOM_HID_FS">
        <CallLibMethod Name="USBD_Init" ReturnHAL="false" Phase="preOS">
            <MethodArg Name="hUsbDevice" ParameterName="hUsbDeviceFS"/>
            <!--<MethodArg Name="USBD_DESC" ParameterName="HID_Desc"/>-->
            <MethodArg Name="USBD_DESC" ParameterName="FS_Desc"/>
            <MethodArg Name="id" ParameterName="DEVICE_FS"/>
        </CallLibMethod> 
        <CallLibMethod Name="USBD_RegisterClass" ReturnHAL="false" Phase="preOS">
            <MethodArg Name="hUsbDevice" ParameterName="hUsbDeviceFS"/>
            <MethodArg Name="USBD_CLASS" ParameterName="USBD_CUSTOM_HID"/>
        </CallLibMethod>  
        <CallLibMethod Name="USBD_CUSTOM_HID_RegisterInterface" ReturnHAL="false" Phase="preOS">
            <MethodArg Name="hUsbDevice" ParameterName="hUsbDeviceFS"/>
            <MethodArg Name="USBD_USER_CALLBACK" ParameterName="USBD_CustomHID_fops_FS"/>
        </CallLibMethod> 
        <CallLibMethod Name="USBD_Start" ReturnHAL="false" Phase="postOS">
            <MethodArg Name="hUsbDevice" ParameterName="hUsbDeviceFS"/>
        </CallLibMethod>  
        <Component Name="Middlewares:USB_DEVICE:CUSTOM_HID"/>
        <ConfigFile Name="USBD_CONF_CUSTOM_HID_H"/>        
        <ConfigFile Name="USBD_CONF_FS_C"/>
        <ConfigFile Name="USBD_DESC_H"/> 
        <ConfigFile Name="USBD_DESC_C"/>
        <ConfigFile Name="USBD_DESC_FS_H"/> 
        <ConfigFile Name="USBD_DESC_CUSTOM_HID_FS_C"/>
        <ConfigFile Name="USBD_INF_CUSTOM_HID_H_FS"/> 
        <ConfigFile Name="USBD_INF_CUSTOM_HID_C_FS"/>
    </RefConfig>
 [...]
    <LibMethod Comment="" Name="USBD_CUSTOM_HID_RegisterInterface">
        <Argument AddressOf="true" Context="global;NOT_INIT" GenericType="struct" Name="hUsbDevice" TypeName="USBD_HandleTypeDef">
            <Argument AddressOf="false" GenericType="simple" Name="dev_config" OptimizationCondition="equal"/>          
        </Argument> 
        <Argument AddressOf="true" Comment="" Context="local;NOT_INIT" GenericType="simple" Name="USBD_USER_CALLBACK" TypeName="int"/>                                 
    </LibMethod>
[...]
         <SubComponent Csub="CUSTOM_HID" Description="Custom Human Interface Device">
            <File Category="header" Name="Class/CustomHID/Inc/usbd_customhid.h"/>
            <File Category="source" Name="Class/CustomHID/Src/usbd_customhid.c"/>
        </SubComponent>  
[...]
     <RefConfigFile Description="Header file for #define" Name="USBD_CONF_CUSTOM_HID_H" Template="usbdconf_f1_h.ftl">      
        <File Category="header" Condition="all" Name="Target/usbd_conf.h" Version=""/>
        <!-- Parameters for Function and Buffer Configurations -->
        <Argument Comment="" GenericType="simple" Name="USBD_MAX_NUM_INTERFACES"/>
        <Argument Comment="" GenericType="simple" Name="USBD_MAX_NUM_CONFIGURATION"/>
        <Argument Comment="" GenericType="simple" Name="USBD_MAX_STR_DESC_SIZ"/>
        <!--<Argument Comment="" GenericType="simple" Name="USBD_SUPPORT_USER_STRING"/>-->     
        <Argument Comment="" GenericType="simple" Name="USBD_DEBUG_LEVEL"/>         
        <Argument Comment="" GenericType="simple" Name="USBD_SELF_POWERED"/>       
        <Argument Comment="" GenericType="simple" Name="USBD_CUSTOMHID_OUTREPORT_BUF_SIZE"/> 
        <Argument Comment="" GenericType="simple" Name="USBD_CUSTOM_HID_REPORT_DESC_SIZE"/>  
         <Argument Comment="" GenericType="simple" Name="CUSTOM_HID_FS_BINTERVAL"/>  
    </RefConfigFile>

Then of course there are various files in the
STM32CubeMX/db/templates directory:
     usbd_custom_hid_if_c.ftl
     usbd_custom_hid_if_l4_c.ftl
     usbd_custom_hid_if_h7_c.ftl       
     usbd_custom_hid_if_f7_c.ftl   
     usbd_custom_hid_if_f4_c.ftl 
     usbd_custom_hid_if_l5_c.ftl  
     usbd_custom_hid_if_g4_c.ftl 
     usbd_custom_hid_if_h.ftl 
     usbd_custom_hid_if_wb_c.ftl 

Has anybody tried to add the support for USB CUSTOM CLASS by adding sections/files similar to the above ones (with custom_hid replaced with custom_class), of course with apprpriately modified contents?
Have I overlooked something else that should be modified?

TIA & Regards,
Wojtek

The 2025 Embedded Online Conference