AM2612: 官方参考工程endat_diagnostic_single_channel,里面用的CFG的,但是我想用ZCZ ZEJ ZNC来做,

Part Number: AM2612
Other Parts Discussed in Thread: SYSCONFIG

可是修改封装后sysconfig老提示如下错误,能否提供一下其余封装的工程,建议能出一套详细的SDK教程,本来处理器很不错,但是在PRU-ICSS怎么分配ENDAT2.2及ETHERCAT的管脚过程中,太难了,特别容易出错,能否给弄一个简单教程。针对不同的串行编码器协议,和工业总线怎么安全正确的分配管脚,大家首先就被这个弄的迷迷糊糊的,也就不乐意选择这个处理器了。详细弄一个简明易懂的PRU-ICSS的应用教程。

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,有消息了吗?

  • Hi Lzg,

    There is an issue in motor control sdk and mcu plus sdk with AM261x device detection.

    Here's the fix:

    Replace device detection in these files:

    MCU Plus SDK:
    - source/drivers/.meta/pruicss/m_v0/ (similar files)

    Similar changes need to be made for the Motor Control SDK as well. I am sharing the updated files for the Endat example:

    • motor_control_sdk\source\.meta\position_sense\endat\am26x_pins.js
    • motor_control_sdk\source/.meta/position_sense/endat.syscfg.js

    let common = system.getScript("/common");
    let is_am261x_soc = (common.getSocName() == "am261x") ? true : false;
    let device = is_am261x_soc ? common.getSocName() : common.getDeviceName();
    let pinmux = system.getScript("/drivers/pinmux/pinmux");
    let is_am263x_soc = (device === "am263x-cc") ? true : false;
    let is_am263px_soc = (device === "am263px-cc") ? true : false;
    
    function getInterfaceName(inst)
    {
        if(is_am263px_soc)
        {
            return "PRU-ICSS";
        }
        else if(is_am263x_soc)
        {
            return inst.instance;
        } else if (is_am261x_soc) 
        {
            if(inst.instance === "ICSSM0") {
                return "PRU-ICSS0";
            } else {
                return "PRU-ICSS1";
            }
        }
    }
    
    function getInterfacePinList(inst)
    {
        let pinList = [];
    
        let Slice = inst["PRU_Slice"];
    
        if (is_am261x_soc) {
            if(inst.instance === "ICSSM0") {
                Slice = "PR0_"+Slice;
            } else {
                Slice = "PR1_"+Slice;
            }
        } else {
            Slice = "PR0_"+Slice;
        }
    
        pinList.push({ pinName: Slice.toString()+"_GPIO2", displayName: "ENDAT_CHANNEL0_TX_ENABLE", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO1", displayName: "ENDAT_CHANNEL0_TX", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO0", displayName: "ENDAT_CHANNEL0_CLK", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO9", displayName: "ENDAT_CHANNEL0_RX", rx: true});
    
        pinList.push({ pinName: Slice.toString()+"_GPIO5", displayName: "ENDAT_CHANNEL1_TX_ENABLE", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO4", displayName: "ENDAT_CHANNEL1_TX", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO3", displayName: "ENDAT_CHANNEL1_CLK", rx: false});
        pinList.push({ pinName: Slice.toString()+"_GPIO10", displayName: "ENDAT_CHANNEL1_RX", rx: true});
    
        // PR0_PRU0_GPIO7 Pin is only available for AM261x SoC. It's not available for AM263Px & AM263x SoC.
        if(is_am261x_soc)
        {   pinList.push({ pinName: Slice.toString()+"_GPIO8", displayName: "ENDAT_CHANNEL2_TX_ENABLE", rx: false});
            pinList.push({ pinName: Slice.toString()+"_GPIO7", displayName: "ENDAT_CHANNEL2_TX", rx: false});
            pinList.push({ pinName: Slice.toString()+"_GPIO6", displayName: "ENDAT_CHANNEL2_CLK", rx: false});
            pinList.push({ pinName: Slice.toString()+"_GPIO11", displayName: "ENDAT_CHANNEL2_RX", rx: true});
        }
        else if(is_am263px_soc || is_am263x_soc)
        {
            if(Slice == "PR0_PRU1")
            {   pinList.push({ pinName: Slice.toString()+"_GPIO8", displayName: "ENDAT_CHANNEL2_TX_ENABLE", rx: false});
                pinList.push({ pinName: Slice.toString()+"_GPIO7", displayName: "ENDAT_CHANNEL2_TX", rx: false});
                pinList.push({ pinName: Slice.toString()+"_GPIO6", displayName: "ENDAT_CHANNEL2_CLK", rx: false});
                pinList.push({ pinName: Slice.toString()+"_GPIO11", displayName: "ENDAT_CHANNEL2_RX", rx: true});
            }
        }
        return pinList;
    }
    
    function pinmuxRequirements(inst) {
    
        let interfaceName = getInterfaceName(inst);
        let pinList = getInterfacePinList(inst);
        let resources = [];
    
        let Slice = inst["PRU_Slice"];
    
        if (is_am261x_soc) {
            if(inst.instance === "ICSSM0") {
                Slice = "PR0_"+Slice;
            } else {
                Slice = "PR1_"+Slice;
            }
        } else {
            Slice = "PR0_"+Slice;
        }
    
        for(let pin of pinList)
        {
            let pinResource = pinmux.getPinRequirements(interfaceName, pin.pinName, pin.displayName);
    
            pinmux.setConfigurableDefault( pinResource, "rx", pin.rx );
    
            if(inst["Channel_0"]==true){
                if( (pin.pinName == Slice.toString()+"_GPIO2") || (pin.pinName == Slice.toString()+"_GPIO1") || (pin.pinName == Slice.toString()+"_GPIO0") || (pin.pinName == Slice.toString()+"_GPIO9")){
                     pinResource.used = true;
                }
            }else{
                if( (pin.pinName == Slice.toString()+"_GPIO2") || (pin.pinName == Slice.toString()+"_GPIO1") || (pin.pinName == Slice.toString()+"_GPIO0") || (pin.pinName == Slice.toString()+"_GPIO9")){
                    pinResource.used = false;
                }
            }
    
            if(inst["Channel_1"]==true){
                if( (pin.pinName == Slice.toString()+"_GPIO5") || (pin.pinName == Slice.toString()+"_GPIO4") || (pin.pinName == Slice.toString()+"_GPIO3") || (pin.pinName == Slice.toString()+"_GPIO10")){
                      pinResource.used = true;
                 }
            }else{
                if( (pin.pinName == Slice.toString()+"_GPIO5") || (pin.pinName == Slice.toString()+"_GPIO4") || (pin.pinName == Slice.toString()+"_GPIO3") || (pin.pinName == Slice.toString()+"_GPIO10")){
                    pinResource.used = false;
                }
            }
            if(is_am263x_soc || is_am263px_soc)
            {
                if(Slice =="PR0_PRU1")
                {
                    if(inst["Channel_2"]==true){
                        if( (pin.pinName == Slice.toString()+"_GPIO8") || (pin.pinName == Slice.toString()+"_GPIO7") || (pin.pinName == Slice.toString()+"_GPIO6") || (pin.pinName == Slice.toString()+"_GPIO11")){
                            pinResource.used = true;
                        }
                    }else{
                            if( (pin.pinName == Slice.toString()+"_GPIO8") || (pin.pinName == Slice.toString()+"_GPIO7") || (pin.pinName == Slice.toString()+"_GPIO6") || (pin.pinName == Slice.toString()+"_GPIO11")){
                            pinResource.used = false;
                        }
                    }
                }
            }
            else
            { 
                if(inst["Channel_2"]==true){
                    if( (pin.pinName == Slice.toString()+"_GPIO8") || (pin.pinName == Slice.toString()+"_GPIO7") || (pin.pinName == Slice.toString()+"_GPIO6") || (pin.pinName == Slice.toString()+"_GPIO11")){
                        pinResource.used = true;
                    }
                }else{
                        if( (pin.pinName == Slice.toString()+"_GPIO8") || (pin.pinName == Slice.toString()+"_GPIO7") || (pin.pinName == Slice.toString()+"_GPIO6") || (pin.pinName == Slice.toString()+"_GPIO11")){
                        pinResource.used = false;
                    }
                }
            }
        resources.push( pinResource );
        }   
    
        let peripheralRequirements = {
            name: interfaceName,
            displayName: interfaceName,
            interfaceName: interfaceName,
            resources: resources,
            canShareWith: "/motor_control"
        };
    
        return [peripheralRequirements];
    }
    
    function getPeripheralPinNames(inst)
    {
        let pinList = [];
        let pinNameList = [];
    
        pinList = getInterfacePinList(inst);
    
        for(let pin of pinList)
        {
            pinNameList.push( pin.pinName );
        }
    
        return pinNameList;
    }
    
    exports = {
    
        pinmuxRequirements,
        getInterfaceName,
        getPeripheralPinNames,
    };
    

    let common = system.getScript("/common");
    let endat_module_name = "/position_sense/endat";
    let is_am261x_soc = (common.getSocName() == "am261x") ? true : false;
    let device = is_am261x_soc ? common.getSocName() : common.getDeviceName();
    let is_am26x_soc = (device === "am263x-cc" || device === "am261x" || device === "am263px-cc") ? true : false;
    let is_am263x_soc = (device === "am263x-cc") ? true : false;
    let is_am263px_soc = (device === "am263px-cc") ? true : false;
    
    let hdsl_endat_pins = (is_am26x_soc) ? system.getScript("/position_sense/endat/am26x_pins.js") : system.getScript("/position_sense/hdsl_endat_pins.js");
    
    function validateCmpEventWarnings(instance, inst, validation) {
        /* Helper function to check and warn about CMP0 and CMP1 usage */
        const checkCmpEvent = (cmpEvent, fieldName) => {
            if (cmpEvent === 0) {
                validation.logWarning(
                    "CMP0 is used for IEP counter reset in periodic CMP mode. Using CMP0 may cause conflicts.",
                    inst,
                    fieldName
                );
            } else if (cmpEvent === 1) {
                validation.logWarning(
                    "CMP1 is used for SYNC OUT0 generation in periodic CAP mode. Using CMP1 may cause conflicts if CAP mode is used.",
                    inst,
                    fieldName
                );
            }
        };
    
        if (!instance.Multi_Channel_Load_Share) {
            /* Non-load share mode - check global CMP event */
            checkCmpEvent(instance.CMP_Event_Num, "CMP_Event_Num");
        } else {
            /* Load share mode - check per-channel CMP events */
            if (instance.Channel_0) {
                checkCmpEvent(instance.CMP_Event_Num_CH0, "CMP_Event_Num_CH0");
            }
            if (instance.Channel_1) {
                checkCmpEvent(instance.CMP_Event_Num_CH1, "CMP_Event_Num_CH1");
            }
            if (instance.Channel_2) {
                checkCmpEvent(instance.CMP_Event_Num_CH2, "CMP_Event_Num_CH2");
            }
        }
    }
    
    function onValidate(inst, validation) {
        for (let instance_index in inst.$module.$instances)
        {
            let instance = inst.$module.$instances[instance_index];
    
            /* Validate CMP0 and CMP1 usage warnings */
            validateCmpEventWarnings(instance, inst, validation);
    
            /* select atleast one cahnnel */
            if ((!instance.Channel_0)&&(!instance.Channel_2)&&(!instance.Channel_1))
                validation.logError("Select atleast one channel", inst, "Channel_0");
    
            /* Calculate total channels for validation */
            let total_channels = (instance.Channel_0 ? 1 : 0) + (instance.Channel_1 ? 1 : 0) + (instance.Channel_2 ? 1 : 0);
    
            /* AM26x SOC specific validation - only single channel supported */
            if(is_am26x_soc && total_channels > 1)
            {
                validation.logError("AM26x devices support only single channel operation per PRU core", inst, "Channel_0");
            }
    
            /* channel 0 and channel 2 are supported on am243x-lp*/
            if((device === "am243x-lp") && (instance.Channel_1) && (instance.Booster_Pack))
            {
                validation.logError("Channel 1 is not supported on BP-AM2BLDCSERVO BoosterPack due to pinout limitations", inst, "Booster_Pack");
            }
    
            /* validation for BP-AM2BLDCSERVO BoosterPack */
            if((device!="am243x-lp" && device != "am263x-cc" && device!="am261x" && device != "am263px-cc" )&&(instance.Booster_Pack))
            {
                validation.logError("Select only when using BP-AM2BLDCSERVO BoosterPack with LP", inst, "Booster_Pack");
            }
            if(is_am26x_soc)
            {
                if(is_am263x_soc || is_am263px_soc)
                {
                    if(instance.PRU_Slice == "PRU0" && instance.Channel_2)
                    {
                        validation.logError("Channel 2 TX signal is not pinned out at the device level", inst, "Channel_2");
                    }
    
                    if((instance.Channel_2 || instance.Channel_0)&&(instance.Booster_Pack))
                    {
                        validation.logError("Channel 0 and Channel 2 are not supported on BP-AM2BLDCSERVO BoosterPack due to pinout limitations", inst, "Booster_Pack");
                    }
                }
                if(is_am261x_soc)
                {
    
                    if((instance.Channel_2 || instance.Channel_1)&&(instance.Booster_Pack))
                    {
                        validation.logError("Channel 1 and Channel 2 are not supported on BP-AM2BLDCSERVO BoosterPack due to pinout limitations", inst, "Booster_Pack");
                    }
                }
            }
    
            /* Validate CMP and CAP event numbers don't conflict across channels in load share mode */
            if (instance.Multi_Channel_Load_Share) {
                let enabled_channels = [];
    
                /* Collect enabled channels and their event numbers */
                if (instance.Channel_0) {
                    enabled_channels.push({
                        name: "Channel 0",
                        cmp_event: instance.CMP_Event_Num_CH0,
                        cap_event: instance.CAP_Event_Num_CH0,
                        cmp_field: "CMP_Event_Num_CH0",
                        cap_field: "CAP_Event_Num_CH0"
                    });
                }
    
                if (instance.Channel_1) {
                    enabled_channels.push({
                        name: "Channel 1",
                        cmp_event: instance.CMP_Event_Num_CH1,
                        cap_event: instance.CAP_Event_Num_CH1,
                        cmp_field: "CMP_Event_Num_CH1",
                        cap_field: "CAP_Event_Num_CH1"
                    });
                }
    
                if (instance.Channel_2) {
                    enabled_channels.push({
                        name: "Channel 2",
                        cmp_event: instance.CMP_Event_Num_CH2,
                        cap_event: instance.CAP_Event_Num_CH2,
                        cmp_field: "CMP_Event_Num_CH2",
                        cap_field: "CAP_Event_Num_CH2"
                    });
                }
    
                /* Check for CMP event conflicts between channels */
                for (let i = 0; i < enabled_channels.length; i++) {
                    for (let j = i + 1; j < enabled_channels.length; j++) {
                        if (enabled_channels[i].cmp_event === enabled_channels[j].cmp_event) {
                            validation.logError(
                                enabled_channels[i].name + " and " + enabled_channels[j].name +
                                " cannot use the same IEP CMP event number (CMP" + enabled_channels[i].cmp_event + ")",
                                inst,
                                enabled_channels[j].cmp_field
                            );
                        }
                    }
                }
    
                /* Check for CAP event conflicts between channels */
                for (let i = 0; i < enabled_channels.length; i++) {
                    for (let j = i + 1; j < enabled_channels.length; j++) {
                        if (enabled_channels[i].cap_event === enabled_channels[j].cap_event) {
                            validation.logError(
                                enabled_channels[i].name + " and " + enabled_channels[j].name +
                                " cannot use the same IEP CAP event number (CAP" + enabled_channels[i].cap_event + ")",
                                inst,
                                enabled_channels[j].cap_field
                            );
                        }
                    }
                }
            }
        }
    }
    
    let endat_module = {
        displayName: "EnDat Position Encoder",
        templates: {
            "/drivers/system/system_config.c.xdt": {
                driver_config: "/position_sense/endat/endat_templates.c.xdt",
                moduleName: endat_module_name,
            },
            "/drivers/system/system_config.h.xdt": {
                driver_config:"/.meta/position_sense/endat/endat_templates.h.xdt",
                moduleName: endat_module_name,
            },
            "/drivers/pinmux/pinmux_config.c.xdt": {
                moduleName: endat_module_name,
            },
        },
        defaultInstanceName: "CONFIG_ENDAT",
        config: [
            {
                name: "instance",
                displayName: "Instance",
                default: (is_am261x_soc) ? "ICSSM1" : ((is_am263x_soc || is_am263px_soc ) ? "ICSSM" : "ICSSG0"),
                options: (is_am261x_soc) ?
                            [
                                {
                                    name: "ICSSM0",
                                },
                                {
                                    name: "ICSSM1",
                                }
                            ]
                            :
                            ((is_am263x_soc || is_am263px_soc) ?
                            [
                                {
                                name: "ICSSM",
                                displayName:"ICSSM0"
                                }
                            ]
                            :
                            [
                                {
                                    name: "ICSSG0",
                                },
                                {
                                    name: "ICSSG1",
                                }
                            ])
            },
            {
                name: "G_MUX_EN",
                displayName: "Enable G Mux",
                longDescription : `The G_MUX_EN bit (bit 7) in the ICSSG_SA_MX_REG register is a multiplexer control bit that enables alternative pin configurations for the PRUICSS Peripheral Interface mode. 
                                   This bit allows remapping of receive pins to support different hardware configurations and use cases.
                                    
    #### Pin Multiplexing Behavior
    
    | G_MUX_EN Value | Channel 0 Receive | Channel 1 Receive | Channel 2 Transmit | Description                    |
    |----------------|-------------------|-------------------|--------------------|--------------------------------|
    | 0 (Default)    | GPI9              | GPI10             | GPO7               | Default pinmux configuration   |
    | 1 (Enabled)    | GPI13             | GPI14             | GPO12              | Alternate pinmux configuration |`,
                default: false,
                hidden:  (device == "am243x-lp" ||device == "am243x-evm" ||device == "am64x-evm") ? false : true,
            },
            {
                name: "Tx_Rx_Clk_Source",
                displayName: "TX RX FIFO Clock Source",
                description: "TX RX FIFO Clock Source Options. See module specific page in SDK documentation for more details and known limitations.",
                default: "0",
                options: [
                    {
                        name: "0",
                        displayName: "ICSS UART Clock",
                    },
                    {
                        name: "1",
                        displayName: "ICSS Core Clock",
                    },
                ],
            },
            {
                name: "Channel_0",
                displayName: "Enable Channel 0",
                description: "Channel 0 Selection",
                default: true,
                onChange: function(inst, ui) {
                    if (inst.Multi_Channel_Load_Share) {
                        ui.CMP_Event_Num_CH0.hidden = !inst.Channel_0;
                        ui.CAP_Event_Num_CH0.hidden = !inst.Channel_0;
                    }
                },
            },
            {
                name: "Channel_1",
                displayName: "Enable Channel 1",
                description: "Channel 1 Selection",
                default: false,
                onChange: function(inst, ui) {
                    if (inst.Multi_Channel_Load_Share) {
                        ui.CMP_Event_Num_CH1.hidden = !inst.Channel_1;
                        ui.CAP_Event_Num_CH1.hidden = !inst.Channel_1;
                    }
                },
            },
            {
                name: "Channel_2",
                displayName: "Enable Channel 2",
                description: "Channel 2 Selection",
                default: false,
                onChange: function(inst, ui) {
                    if (inst.Multi_Channel_Load_Share) {
                        ui.CMP_Event_Num_CH2.hidden = !inst.Channel_2;
                        ui.CAP_Event_Num_CH2.hidden = !inst.Channel_2;
                    }
                },
            },
            {
                name: "Multi_Channel_Load_Share",
                displayName: "Multi Channel Load Share",
                description: "Selected Channels have different make",
                hidden :(is_am26x_soc) ? true : false,
                default: false,
                onChange: function(inst, ui) {
                    /* When load share is toggled, update visibility of event selectors */
                    if (inst.Multi_Channel_Load_Share) {
                        /* Hide global CMP and CAP event selectors */
                        ui.CMP_Event_Num.hidden = true;
                        ui.CAP_Event_Num.hidden = true;
                        /* Show per-channel CMP and CAP selectors based on enabled channels */
                        ui.CMP_Event_Num_CH0.hidden = !inst.Channel_0;
                        ui.CAP_Event_Num_CH0.hidden = !inst.Channel_0;
                        ui.CMP_Event_Num_CH1.hidden = !inst.Channel_1;
                        ui.CAP_Event_Num_CH1.hidden = !inst.Channel_1;
                        ui.CMP_Event_Num_CH2.hidden = !inst.Channel_2;
                        ui.CAP_Event_Num_CH2.hidden = !inst.Channel_2;
                    } else {
                        /* Show global CMP and CAP event selectors */
                        ui.CMP_Event_Num.hidden = false;
                        ui.CAP_Event_Num.hidden = false;
                        /* Hide all per-channel selectors */
                        ui.CMP_Event_Num_CH0.hidden = true;
                        ui.CAP_Event_Num_CH0.hidden = true;
                        ui.CMP_Event_Num_CH1.hidden = true;
                        ui.CAP_Event_Num_CH1.hidden = true;
                        ui.CMP_Event_Num_CH2.hidden = true;
                        ui.CAP_Event_Num_CH2.hidden = true;
                    }
                },
            },
            {
                name: "Booster_Pack",
                displayName: "Using BP-AM2BLDCSERVO BoosterPack",
                description: "Only for BP-AM2BLDCSERVO BoosterPack",
                default: false,
            },
    
            {
                name: "PRU_Slice",
                displayName: "Select PRU Slice",
                description: "ICSSM PRU Slice",
                hidden :(is_am26x_soc) ? false : true,
                default: "PRU1",
                options: [
                    {
                        name: "PRU0",
                    },
                    {
                        name: "PRU1",
                    },
                ],
            },
            {
                name: "Periodic_Trigger_Mode_Config",
                displayName: "Periodic Trigger Mode Configuration",
                description: "Configure periodic trigger mode using IEP CMP and CAP events.",
                config: [
                    {
                        name: "IEP_Instance",
                        displayName: "Select IEP Instance",
                        description: "Select IEP instance for periodic trigger",
                        default: "IEP0",
                        options: (is_am26x_soc) ?
                            [
                                {
                                    name: "IEP0",
                                },
                            ]
                            :
                            [
                                {
                                    name: "IEP0",
                                },
                                {
                                    name: "IEP1",
                                },
                            ],
                    },
                    {
                        name: "CMP_Event_Num",
                        displayName: "IEP CMP Event Number",
                        description: "CMP event number (0-15) for periodic CMP trigger mode",
                        default: 2,
                        hidden: false,
                        options: [
                            { name: 0, displayName: "CMP0" },
                            { name: 1, displayName: "CMP1" },
                            { name: 2, displayName: "CMP2" },
                            { name: 3, displayName: "CMP3" },
                            { name: 4, displayName: "CMP4" },
                            { name: 5, displayName: "CMP5" },
                            { name: 6, displayName: "CMP6" },
                            { name: 7, displayName: "CMP7" },
                            { name: 8, displayName: "CMP8" },
                            { name: 9, displayName: "CMP9" },
                            { name: 10, displayName: "CMP10" },
                            { name: 11, displayName: "CMP11" },
                            { name: 12, displayName: "CMP12" },
                            { name: 13, displayName: "CMP13" },
                            { name: 14, displayName: "CMP14" },
                            { name: 15, displayName: "CMP15" },
                        ],
                    },
                    {
                        name: "CAP_Event_Num",
                        displayName: "IEP CAP Event Number",
                        description: "CAP event number (0-7) for periodic CAP trigger mode. Note: Routing (SYNC out to CAP) is done in application code (endat_config_iep_cap_for_sync). Correct router signal should be configured for selected CAP event if needed",
                        default: 6,
                        hidden: false,
                        options: [
                            { name: 0, displayName: "CAP0" },
                            { name: 1, displayName: "CAP1" },
                            { name: 2, displayName: "CAP2" },
                            { name: 3, displayName: "CAP3" },
                            { name: 4, displayName: "CAP4" },
                            { name: 5, displayName: "CAP5" },
                            { name: 6, displayName: "CAP6 (LATCH_IN0)" },
                            { name: 7, displayName: "CAP7 (LATCH_IN1)" },
                        ],
                    },
                    /* Channel event numbers (only shown when load share is enabled) */
                    /* CMP Event Numbers for each channel */
                    {
                        name: "CMP_Event_Num_CH0",
                        displayName: "Channel 0 - CMP Event Number",
                        description: "CMP event number (0-15) for Channel 0 periodic CMP trigger mode",
                        default: 2,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CMP0" },
                            { name: 1, displayName: "CMP1" },
                            { name: 2, displayName: "CMP2" },
                            { name: 3, displayName: "CMP3" },
                            { name: 4, displayName: "CMP4" },
                            { name: 5, displayName: "CMP5" },
                            { name: 6, displayName: "CMP6" },
                            { name: 7, displayName: "CMP7" },
                            { name: 8, displayName: "CMP8" },
                            { name: 9, displayName: "CMP9" },
                            { name: 10, displayName: "CMP10" },
                            { name: 11, displayName: "CMP11" },
                            { name: 12, displayName: "CMP12" },
                            { name: 13, displayName: "CMP13" },
                            { name: 14, displayName: "CMP14" },
                            { name: 15, displayName: "CMP15" },
                        ],
                    },
                    {
                        name: "CAP_Event_Num_CH0",
                        displayName: "Channel 0 - CAP Event Number",
                        description: "CAP event number (0-7) for Channel 0 periodic CAP trigger mode. Note: Routing (SYNC out to CAP) is done in application code (endat_config_iep_cap_for_sync). Correct router signal should be configured for selected CAP event if needed",
                        default: 6,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CAP0" },
                            { name: 1, displayName: "CAP1" },
                            { name: 2, displayName: "CAP2" },
                            { name: 3, displayName: "CAP3" },
                            { name: 4, displayName: "CAP4" },
                            { name: 5, displayName: "CAP5" },
                            { name: 6, displayName: "CAP6 (LATCH_IN0)" },
                            { name: 7, displayName: "CAP7 (LATCH_IN1)" },
                        ],
                    },
                    {
                        name: "CMP_Event_Num_CH1",
                        displayName: "Channel 1 - CMP Event Number",
                        description: "CMP event number (0-15) for Channel 1 periodic CMP trigger mode",
                        default: 3,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CMP0" },
                            { name: 1, displayName: "CMP1" },
                            { name: 2, displayName: "CMP2" },
                            { name: 3, displayName: "CMP3" },
                            { name: 4, displayName: "CMP4" },
                            { name: 5, displayName: "CMP5" },
                            { name: 6, displayName: "CMP6" },
                            { name: 7, displayName: "CMP7" },
                            { name: 8, displayName: "CMP8" },
                            { name: 9, displayName: "CMP9" },
                            { name: 10, displayName: "CMP10" },
                            { name: 11, displayName: "CMP11" },
                            { name: 12, displayName: "CMP12" },
                            { name: 13, displayName: "CMP13" },
                            { name: 14, displayName: "CMP14" },
                            { name: 15, displayName: "CMP15" },
                        ],
                    },
                    {
                        name: "CAP_Event_Num_CH1",
                        displayName: "Channel 1 - CAP Event Number",
                        description: "CAP event number (0-7) for Channel 1 periodic CAP trigger mode. Note: Routing (SYNC out to CAP) is done in application code (endat_config_iep_cap_for_sync). Correct router signal should be configured for selected CAP event if needed",
                        default: 0,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CAP0" },
                            { name: 1, displayName: "CAP1" },
                            { name: 2, displayName: "CAP2" },
                            { name: 3, displayName: "CAP3" },
                            { name: 4, displayName: "CAP4" },
                            { name: 5, displayName: "CAP5" },
                            { name: 6, displayName: "CAP6 (LATCH_IN0)" },
                            { name: 7, displayName: "CAP7 (LATCH_IN1)" },
                        ],
                    },
                    {
                        name: "CMP_Event_Num_CH2",
                        displayName: "Channel 2 - CMP Event Number",
                        description: "CMP event number (0-15) for Channel 2 periodic CMP trigger mode",
                        default: 4,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CMP0" },
                            { name: 1, displayName: "CMP1" },
                            { name: 2, displayName: "CMP2" },
                            { name: 3, displayName: "CMP3" },
                            { name: 4, displayName: "CMP4" },
                            { name: 5, displayName: "CMP5" },
                            { name: 6, displayName: "CMP6" },
                            { name: 7, displayName: "CMP7" },
                            { name: 8, displayName: "CMP8" },
                            { name: 9, displayName: "CMP9" },
                            { name: 10, displayName: "CMP10" },
                            { name: 11, displayName: "CMP11" },
                            { name: 12, displayName: "CMP12" },
                            { name: 13, displayName: "CMP13" },
                            { name: 14, displayName: "CMP14" },
                            { name: 15, displayName: "CMP15" },
                        ],
                    },
                    {
                        name: "CAP_Event_Num_CH2",
                        displayName: "Channel 2 - CAP Event Number",
                        description: "CAP event number (0-7) for Channel 2 periodic CAP trigger mode. Note: Routing (SYNC out to CAP) is done in application code (endat_config_iep_cap_for_sync). Correct router signal should be configured for selected CAP event if needed",
                        default: 7,
                        hidden: true,
                        options: [
                            { name: 0, displayName: "CAP0" },
                            { name: 1, displayName: "CAP1" },
                            { name: 2, displayName: "CAP2" },
                            { name: 3, displayName: "CAP3" },
                            { name: 4, displayName: "CAP4" },
                            { name: 5, displayName: "CAP5" },
                            { name: 6, displayName: "CAP6 (LATCH_IN0)" },
                            { name: 7, displayName: "CAP7 (LATCH_IN1)" },
                        ],
                    },
                ],
                collapsed: false,
            },
        ],
        moduleStatic: {
            modules: function(inst) {
                return [{
                    name: "system_common",
                    moduleName: "/system_common",
                }]
            },
        },
        pinmuxRequirements: hdsl_endat_pins.pinmuxRequirements,
        getInterfaceName: hdsl_endat_pins.getInterfaceName,
        getPeripheralPinNames: hdsl_endat_pins.getPeripheralPinNames,
        sharedModuleInstances: sharedModuleInstances,
        moduleInstances: moduleInstances,
        validate: onValidate,
    
    };
    
    function moduleInstances(instance){
        let modInstances = new Array();
        let BoosterPack = instance["Booster_Pack"];
        let total_channels = (instance["Channel_0"] ? 1 : 0) + (instance["Channel_1"] ? 1 : 0) + (instance["Channel_2"] ? 1 : 0);
        if((device == "am243x-lp") || is_am26x_soc)
        {
            if(BoosterPack)
            {
                modInstances.push({
                    name: "ENC1_EN",
                    displayName: "BP-AM2BLDCSERVO BoosterPack Axis1 Power Enable Pin",
                    moduleName: "/drivers/gpio/gpio",
                    requiredArgs: {
                        pinDir: "OUTPUT",
                        defaultValue: "1",
                        },
                    });
                if((device == "am243x-lp") && (total_channels > 1))
                {
                    modInstances.push({
                        name: "ENC2_EN",
                        displayName: "BP-AM2BLDCSERVO BoosterPack Axis2 Power Enable Pin",
                        moduleName: "/drivers/gpio/gpio",
                        requiredArgs: {
                            pinDir: "OUTPUT",
                            defaultValue: "1",
                            },
                });
               }
            }
            if(is_am263x_soc)
            {
                modInstances.push({
                    name: "PRU_MUX_SEL_GPIO64",
                    displayName: "Select line for PRU MUX",
                    moduleName: "/drivers/gpio/gpio",
                    requiredArgs: {
                        pinDir: "OUTPUT",
                        defaultValue: "1",
    
                    },
                });
                modInstances.push({
                    name: "MUX_EN_GPIO58",
                    displayName: "MUX Enable Pin",
                    moduleName: "/drivers/gpio/gpio",
                    requiredArgs: {
                        pinDir: "OUTPUT",
                        defaultValue: "1",
                    },
                });
            }
        }
        return (modInstances);
    }
    
    function sharedModuleInstances(instance) {
        let modInstances = new Array();
        let requiredArgs = (is_am263x_soc || is_am263px_soc) ? {instance:`${instance.instance}0`} : {instance: instance.instance};
        modInstances.push({
            name: "pru",
            displayName: "PRU ICSS Configuration",
            moduleName: '/drivers/pruicss/pruicss',
            requiredArgs
        });
        return (modInstances);
    }
    
    exports = endat_module;
    

    This will resolve the error you are encountering with the Endat example.

    Similar changes will be required for other modules like Tamagawa/BiSS-C if you use those modules.

    **Change:**
    Replace `common.getDeviceName()` with:'common.getSocName()` and use "am261x" for check 
    ```javascript
    let is_am261x_soc = (common.getSocName() == "am261x") ? true : false;
    let device = is_am261x_soc ? common.getSocName() : common.getDeviceName();
    ```

    BR,

    Achala Ram 

  • 能将其它类型的编码器的这两个文件提供一下吗?我怕我修改错误,或者MOT CONTROL SDK会更新吗?比如bissc、hdsl、nikon、tamagawa,因为我设计可能需要兼容这些编码器类型,或者您是否可以提供一个完整的这个(C:\ti\motor_control_sdk_am261x_10_02_00_07\source\.meta\position_sense)的压缩包给我们,在SDK没更新前,我们直接覆盖了原来的。