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);
}
ふと思い付いて、ちょっと無理矢理ですが、一部を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);
}
- 関連記事
-
- RXマイコン基板(RX62N) | (下準備)SAKURAスケッチ環境2.0をInterface誌付属RX62N基板で試す (1)
- RXマイコン | CubeSuite+シリアルデバッガのダウンロードページ
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェア + RXマイコン用GDBSTUB
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェア + シリアルモニタ
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (9)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (8)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (7)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (6)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (5)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (4)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (3)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (2)
- RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (1)
- RXマイコン基板(RX62N) | Renesas MCU Software Libraryのカスタムクラスファームウェアを試す
- RXマイコン基板(RX62N) | Renesas MCU Software Libraryのマスストレージファームウェアを試す
2013/07/27 blog-entry-314 category: RX /* 32bit CISC */
| h o m e |