なんとかなるさね

マイコンをネタにブログを始めてみました


RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (6) 

現在、あまりに酷いやっつけ作業でルネサスのソースコードを改造してしまったところを見直し中なのですが、
ふと思い付いて、ちょっと無理矢理ですが、一部をArduino風にsetup()とloop()に収めるようにしてみました。

// the setup routine runs once when you press reset:
void setup(void)
{
    USB_UTR_t   utr;
    USB_UTR_t   *ptr;

    usb_cpu_target_init();
    usb_cstd_PrAplTitle();
#ifdef USB_UART_ENABLE
    usb_cpu_Sci_HW_init();              /* ComPort Hw Initialize */
#endif /* USB_UART_ENABLE */
#ifdef USB_ADC_ENABLE
    usb_cpu_AdInit();                   /* 12bit A/D initialize */
#endif /* USB_ADC_ENABLE */

    usb_pmsc_SmpAtapiInitMedia();       /* Media Driver open */

    usb_cstd_ScheInit();                /* Scheduler initialize */
    usb_cstd_IdleTaskStart();           /* Idle Task Start */

    ptr = &utr;
    ptr->ip = USB_PERI_USBIP_NUM;       /* IP number(0or1) */
    if( USB_NOUSE_PP != ptr->ip )       /* USB IP number check */
    {
        ptr->ipp = R_usb_cstd_GetUsbIpAdr(ptr->ip);

        usb_multifunc_registration(ptr);/* Peripheral Application Registration */

        R_usb_cstd_SetTaskPri(USB_PCDCSMP_TSK, USB_PRI_6);  /* PCDC demo sample application task priority set */
        usb_pcdc_apl_init(ptr); /* Application data Initialize and Periodic process request */

        R_usb_cstd_SetTaskPri(USB_PHIDSMP_TSK, USB_PRI_6);  /* PHID demo sample application task priority set */
        usb_phid_apl_init(ptr); /* Application data Initialize and Periodic process request */

        R_usb_cstd_SetTaskPri(USB_PFLSH_TSK, USB_PRI_5);/* ATAPI commands Process task priority set */

        R_usb_cstd_SetTaskPri(USB_PCDC_TSK, USB_PRI_4); /* PCDC Driver Task priority set */
        R_usb_cstd_SetTaskPri(USB_PHID_TSK, USB_PRI_4); /* PHID Driver Task priority set */
        R_usb_cstd_SetTaskPri(USB_PMSC_TSK, USB_PRI_4); /* PMSC Driver Task priority set */

        R_usb_pstd_usbdriver_start(ptr);/* Peripheral USB Driver Start Setting */

        R_usb_cstd_UsbIpInit(ptr, USB_PERI_PP); /* Initialize USB IP */
    }
}

// the loop routine runs over and over again forever:
void loop(void)
{
    R_usb_cstd_Scheduler();             /* Scheduler */
    if( USB_FLGSET == R_usb_cstd_CheckSchedule() )
    {
#ifdef  USB_PERI_MODE_PP
        usb_pstd_PcdTask(0);            /* USB Peripheral control driver Task */

        R_usb_pcdc_task(0);             /* Peripheral CDC Task */
        usb_pcdc_main_task(0);          /* Peripheral CDC demo sample application Task */

        R_usb_phid_task(0);             /* Peripheral HID Task */
        usb_phid_main_task(0);          /* Peripheral HID demo sample application Task */

        usb_pmsc_SmpAtapiTask(0);       /* Execute ATAPI commands Process */
        usb_pmsc_Task(0);               /* Peripheral MSC Task */
#endif  /* USB_PERI_MODE_PP */

        R_usb_cstd_IdleTask(0);         /* Idle Task (sleep sample) */
    }
}

void main(void)
{
    setup();
    for(;;)
    {
        loop();
    }
}

void usb_multifunc_DescriptorChange(USB_UTR_t *ptr, uint16_t mode, uint16_t data2)
{
    uint16_t    i, mxps;

    /* Connect Speed = Hi-Speed? */
    if( mode == USB_HSCONNECT )
    {
        /* Set Descriptor type.  */
        /* Hi-Speed Mode */
        usb_gmultifunc_ConfigrationH1[1]    = USB_DT_CONFIGURATION;
        usb_gmultifunc_ConfigrationF1[1]    = USB_DT_OTHER_SPEED_CONF;
        /* HIGH */
        usb_gmultifunc_ConPtr[0]            = usb_gmultifunc_ConfigrationH1;
        /* FULL */
        usb_gmultifunc_ConPtrOther[0]       = usb_gmultifunc_ConfigrationF1;
        /* Set MaxPacketSize */
        mxps = 512;
    }
    else
    {
        /* Set Descriptor type. */
        /* Full-Speed Mode */
        usb_gmultifunc_ConfigrationF1[1]    = USB_DT_CONFIGURATION;
        usb_gmultifunc_ConfigrationH1[1]    = USB_DT_OTHER_SPEED_CONF;
        /* FULL */
        usb_gmultifunc_ConPtr[0]            = usb_gmultifunc_ConfigrationF1;
        /* HIGH */
        usb_gmultifunc_ConPtrOther[0]       = usb_gmultifunc_ConfigrationH1;
        /* Set MaxPacketSize */
        mxps = 64;
    }

    for( i = 0; usb_gmultifunc_EpTbl1[i] != USB_PDTBLEND; i += USB_EPL )
    {
        if( (usb_gmultifunc_EpTbl1[i + 1] & USB_TYPFIELD) == USB_BULK )
        {
            usb_gmultifunc_EpTbl1[i + 3] = mxps;
        }
    }

#if USB_ANSIIO_PP != USB_ANSIIO_USE_PP
    usb_gpcdc_Inpipe        = usb_gmultifunc_EpTbl1[USB_EPL*0];  /* Pipe no. set for Data Class TX(BulkIn) */
    usb_gpcdc_Outpipe       = usb_gmultifunc_EpTbl1[USB_EPL*1];  /* Pipe no. set for Data Class RX(BulkOut) */
    usb_gpcdc_Status_pipe   = usb_gmultifunc_EpTbl1[USB_EPL*2];  /* Pipe no. set for Communications Class */
#endif  /* USB_ANSIIO_PP != USB_ANSIIO_USE_PP */
    usb_gpmsc_Inpipe        = usb_gmultifunc_EpTbl1[USB_EPL*4];
    usb_gpmsc_Outpipe       = usb_gmultifunc_EpTbl1[USB_EPL*5];
}

USB_ER_t usb_multifunc_Open(USB_UTR_t *ptr, uint16_t data1, uint16_t data2)
{
    usb_pcdc_open(ptr, data1, data2);
    usb_phid_apl_open(ptr, data1, data2);
    R_usb_pmsc_Open(ptr, data1, data2);
    //usb_pvendor_apl_init(ptr, data1, data2);          // Memo for VENDOR class

    return USB_E_OK; // kari
}

USB_ER_t usb_multifunc_Close(USB_UTR_t *ptr, uint16_t data1, uint16_t data2)
{
    usb_pcdc_close(ptr, data1, data2);
    usb_phid_apl_close(ptr, data1, data2);
    R_usb_pmsc_Close(ptr, data1, data2);
    //usb_pvendor_apl_close(ptr, data1, data2);         // Memo for VENDOR class

    return USB_E_OK; // kari
}

void usb_multifunc_SetInterface(USB_UTR_t *ptr, uint16_t data1, uint16_t data2)
{
    R_usb_pcdc_set_interface(ptr, data1, data2);
    R_usb_pmsc_SetInterface(ptr, data1, data2);
}

void usb_multifunc_UsrCtrlTransFunction(USB_UTR_t *ptr, USB_REQUEST_t *req, uint16_t ctsq)
{
    switch( req->ReqIndex )
    {
    case 0:
        R_usb_pcdc_usr_ctrl_trans_function(ptr, req, ctsq);
        break;
    case 2:
        R_usb_phid_control_transfer(ptr, req, ctsq);
        break;
    case 3:
        usb_pmsc_UsrCtrlTransFunction(ptr, req, ctsq);
        break;
    default:
        /* TODO: error */
        break;
    }
    //usb_cstd_UsrCtrlTransFunction(ptr, req, ctsq);    // Memo for VENDOR class
}

void usb_multifunc_registration(USB_UTR_t *ptr)
{
    USB_PCDREG_t    driver;

    /* Driver registration */
    /* Pipe Define Table address */
    driver.pipetbl      = &usb_gmultifunc_EpPtr[0];
    /* Device descriptor Table address */
    driver.devicetbl    = (uint8_t*)&usb_gmultifunc_DeviceDescriptor;
    /* Qualifier descriptor Table address */
    driver.qualitbl     = (uint8_t*)&usb_gmultifunc_QualifierDescriptor;
    /* Configuration descriptor Table address */
    driver.configtbl    = (uint8_t**)&usb_gmultifunc_ConPtr;
    /* Other configuration descriptor Table address */
    driver.othertbl     = (uint8_t**)&usb_gmultifunc_ConPtrOther;
    /* String descriptor Table address */
    driver.stringtbl    = (uint8_t**)&usb_gmultifunc_StrPtr;
    /* Driver init */
    driver.classinit    = &usb_cstd_DummyFunction;
    /* Device default */
    driver.devdefault   = &usb_multifunc_DescriptorChange;
    /* Device configuered */
    driver.devconfig    = (USB_CB_INFO_t)&usb_multifunc_Open;
    /* Device detach */
    driver.devdetach    = (USB_CB_INFO_t)&usb_multifunc_Close;
    /* Device suspend */
    driver.devsuspend   = &usb_cstd_DummyFunction;
    /* Device resume */
    driver.devresume    = &usb_cstd_DummyFunction;
    /* Interfaced change */
    driver.interface    = &usb_multifunc_SetInterface;
    /* Control Transfer */
    driver.ctrltrans    = &usb_multifunc_UsrCtrlTransFunction;

    /* MULTIFUNC class driver registration  */
    R_usb_pstd_DriverRegistration(ptr, &driver);
}


関連記事

2013/07/27   blog-entry-314   category: RX /* 32bit CISC */

go page top