| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934 |
- /*
- * Copyright (c) 2022 OpenLuat & AirM2M
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- #include "user.h"
- #define USB_FIFO_MAX (512)
- #define USB_FIFO_DW_DAX (128)
- /**
- * 结构说明:调试控制寄存器(USBPHY_CR1)结构
- * 偏移地址:0x0108
- * 初 始 值:0x004921AE
- * 属 性:RW
- * 宽 度:32bit
- */
- typedef union _USBPHY_CR1_TypeDef
- {
- uint32_t d32;
- struct{
- uint32_t txpreemphasistune : 1; /* */
- uint32_t txrisetune : 2; /* */
- uint32_t txvreftune : 4; /* */
- uint32_t txfslstune : 4; /* */
- uint32_t sqrxtune : 3; /* */
- uint32_t compdistune : 3; /* */
- uint32_t otgtune : 3; /* */
- uint32_t loopback_enb : 1; /* */
- uint32_t otg_disable : 1; /* */
- uint32_t commononn : 1; /* */
- uint32_t vatestenb : 1; /* */
- uint32_t lsbist : 1; /* */
- uint32_t fsbist : 1; /* */
- uint32_t hsbist : 1; /* */
- uint32_t bisten : 1; /* */
- uint32_t usb_iddq : 1; /* */
- uint32_t stop_ck_for_suspend : 1; /* */
- uint32_t bist_done : 1; /* */
- uint32_t bist_error : 1; /* */
- } b;
- } USBPHY_CR1_TypeDef;
- /**
- * 结构说明:调试控制寄存器(USBPHY_CR3)结构
- * 偏移地址:0x010C
- * 初 始 值:0x00000000
- * 属 性:RW
- * 宽 度:32bit
- */
- typedef union _USBPHY_CR3_TypeDef
- {
- uint32_t d32;
- struct{
- uint32_t idpullup : 1; /* 用于操作 USB PHY的idpullup,启动PHY探测ID状态 */
- uint32_t iddig : 1; /* PHY 输出的ID状态信号,用于软件查询 */
- uint32_t reserved2_31 : 29;
- } b;
- } USBPHY_CR3_TypeDef;
- typedef struct
- {
- // Common USB Registers. 0x00 - 0x0F.
- __IO uint8_t FADDR; // Peripheral Mode Only.
- union
- {
- __IO uint8_t POWER;
- struct
- {
- __IO uint8_t en_suspendM : 1;
- __IO uint8_t suspend_mode : 1;
- __IO uint8_t resume : 1;
- __IO uint8_t reset : 1;
- __IO uint8_t HS_mode : 1; //不支持
- __IO uint8_t HS_enab : 1; //不支持
- __IO uint8_t soft_conn : 1; /* Periphera mode only */
- __IO uint8_t ISO_update : 1; /* Periphera mode only */
- } POWER_b;
- };
- union
- {
- __IO uint16_t INTRTX;
- struct
- {
- __IO uint16_t EP0_intp : 1;
- __IO uint16_t EP1_tx_intp : 1;
- __IO uint16_t EP2_tx_intp : 1;
- __IO uint16_t EP3_tx_intp : 1;
- __IO uint16_t EP4_tx_intp : 1;
- __IO uint16_t EP5_tx_intp : 1;
- __IO uint16_t EP6_tx_intp : 1;
- __IO uint16_t EP7_tx_intp : 1;
- __IO uint16_t EP8_tx_intp : 1;
- __IO uint16_t EP9_tx_intp : 1;
- __IO uint16_t EP10_tx_intp : 1;
- __IO uint16_t EP11_tx_intp : 1;
- __IO uint16_t EP12_tx_intp : 1;
- __IO uint16_t EP13_tx_intp : 1;
- __IO uint16_t EP14_tx_intp : 1;
- __IO uint16_t EP15_tx_intp : 1;
- } INTRTX_b;
- };
- union
- {
- __IO uint16_t INTRRX;
- struct
- {
- uint16_t reserved0 : 1;
- uint16_t EP1_rx_intp : 1;
- uint16_t EP2_rx_intp : 1;
- uint16_t EP3_rx_intp : 1;
- uint16_t EP4_rx_intp : 1;
- uint16_t EP5_rx_intp : 1;
- uint16_t EP6_rx_intp : 1;
- uint16_t EP7_rx_intp : 1;
- uint16_t EP8_rx_intp : 1;
- uint16_t EP9_rx_intp : 1;
- uint16_t EP10_rx_intp : 1;
- uint16_t EP11_rx_intp : 1;
- uint16_t EP12_rx_intp : 1;
- uint16_t EP13_rx_intp : 1;
- uint16_t EP14_rx_intp : 1;
- uint16_t EP15_rx_intp : 1;
- } INTRRX_b;
- };
- union
- {
- __IO uint16_t INTRTXE;
- struct
- {
- uint16_t en_EP0_intp : 1;
- uint16_t en_EP1_tx_intp : 1;
- uint16_t en_EP2_tx_intp : 1;
- uint16_t en_EP3_tx_intp : 1;
- uint16_t en_EP4_tx_intp : 1;
- uint16_t en_EP5_tx_intp : 1;
- uint16_t en_EP6_tx_intp : 1;
- uint16_t en_EP7_tx_intp : 1;
- uint16_t en_EP8_tx_intp : 1;
- uint16_t en_EP9_tx_intp : 1;
- uint16_t en_EP10_tx_intp : 1;
- uint16_t en_EP11_tx_intp : 1;
- uint16_t en_EP12_tx_intp : 1;
- uint16_t en_EP13_tx_intp : 1;
- uint16_t en_EP14_tx_intp : 1;
- uint16_t en_EP15_tx_intp : 1;
- } INTRTXE_b;
- };
- union
- {
- __IO uint16_t INTRRXE;
- struct
- {
- uint16_t reserved0 : 1;
- uint16_t en_EP1_rx_intp : 1;
- uint16_t en_EP2_rx_intp : 1;
- uint16_t en_EP3_rx_intp : 1;
- uint16_t en_EP4_rx_intp : 1;
- uint16_t en_EP5_rx_intp : 1;
- uint16_t en_EP6_rx_intp : 1;
- uint16_t en_EP7_rx_intp : 1;
- uint16_t en_EP8_rx_intp : 1;
- uint16_t en_EP9_rx_intp : 1;
- uint16_t en_EP10_rx_intp : 1;
- uint16_t en_EP11_rx_intp : 1;
- uint16_t en_EP12_rx_intp : 1;
- uint16_t en_EP13_rx_intp : 1;
- uint16_t en_EP14_rx_intp : 1;
- uint16_t en_EP15_rx_intp : 1;
- } INTRRXE_b;
- };
- union
- {
- __IO uint8_t INTRUSB;
- struct
- {
- uint8_t suspend : 1; /* Set when Suspend signaling is detected on the bus. Only valid in Peripheral mode. */
- uint8_t resume : 1; /* Set when Resume signaling is detected on the bus while the MUSBMHDRC is in Suspend mode. */
- uint8_t reset_babble : 1; /* Reset: Set in Peripheral mode when Reset signaling is detected on the bus.
- * Babble: Set in Host mode when babble is detected. Note: Only active after first SOF has been sent.
- */
- uint8_t sof : 1; /* Set when a new frame starts. */
- uint8_t conn : 1; /* Set when a device connection is detected. Only valid in Host mode. Valid at all transaction speeds. */
- uint8_t discon : 1; /* Set in Host mode when a device disconnect is detected. Set in Peripheral mode when a session ends. Valid at all transaction speeds. */
- uint8_t sess_req : 1; /* Set when Session Request signaling has been detected. Only valid when MUSBMHDRC is A device. */
- uint8_t VBus_error : 1; /* Set when VBus drops below the VBus Valid threshold during a session. Only valid when MUSBMHDRC is A device. */
- } INTRUSB_b;
- };
- union
- {
- __IO uint8_t INTRUSBE;
- struct
- {
- uint8_t en_suspend : 1;
- uint8_t en_resume : 1;
- uint8_t en_reset_babble : 1;
- uint8_t en_sof : 1;
- uint8_t en_conn : 1;
- uint8_t en_discon : 1;
- uint8_t en_sess_req : 1;
- uint8_t en_VBus_error : 1;
- } INTRUSBE_b;
- };
- union
- {
- __IO uint16_t FRAME;
- struct
- {
- uint16_t frame_number : 11;
- uint16_t reserved11_15 : 5; /* Always return 0 */
- } FRAME_b;
- };
- __IO uint8_t INDEX;
- __IO uint8_t TESTMODE;
- // Indexed CSR. 0x10 - 0x1F.
- union
- {
- __IO uint16_t TXMAXP;
- struct
- {
- __IO uint16_t max_payload_tran : 11; /* Bits 10:0 define(in bytes)the maximum payload transmitted in single transaction.
- * The value set can be up to 1024 bytes but is subject to the constraints place by
- * the USB Specification on packet sizes for Bulk,Interrupt and Isochronous transfers
- * in Full-speed and High-speed operations.
- */
- __IO uint16_t ex_max : 5;
- } TXMAXP_b;
- };
- union
- {
- __IO uint8_t CSR0L;
- __IO uint8_t TXCSRL;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received. An interrupt is
- * generated when this bit is set. The CPU clear this bit by setting the
- * ServicedRxPktRdy bit.
- */
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bits after loading a data packet into the FIFO. It is clear
- * automatically when a data packet has been transmitted. An interrupt is also
- * generated at this point(if enabled).
- */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted.
- * The CPU should clear this bit.
- */
- __IO uint8_t data_end : 1; /* The CPU sets this bit:
- * 1. When setting TxPktRdy for the last data packet.
- * 2. When clearing RxPktRdy after unloading the last data packet.
- * 3. When setting TxPktRdy for zero length data packet.
- * It is cleared automatically.
- */
- __IO uint8_t setup_end : 1; /* This bit will be set when a control transaction ends before the DataEnd
- * bit has been set. An interrupt will be generated and the FIFO flushed at
- * this time.The bit is cleared by the CPU writing a 1 to the ServicedSetupEnd bit.
- */
- __IO uint8_t send_stall : 1; /* The CPU write a 1 to this bit to terminate the current transaction.
- * The STALL handshake will be transmitted and then this bit will be
- * cleared automatically.
- */
- __IO uint8_t serviced_rxpktrdy : 1; /* The CPU write a 1 to this bit to clear the RxPktRdy bit.
- * It is Cleared automatically.
- */
- __IO uint8_t serviced_setupend : 1; /* The CPU write a 1 to this bit to clear the SetupEnd bit.
- * It is Cleared automatically.
- */
- } CSR0L_DEV_b;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received.An interrupt is generated
- * (If enabled)when this bit set.The CPU should clear this bit when the packet has
- * been read from the FIFO.
- */
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO.It is cleared
- * automatically when a data packet has been transmitted. An interrupt is also
- * generated at this point(If enabled).
- */
- __IO uint8_t rx_stall : 1; /* This bit is set when a STALL handshake is received. The CPU should clear this bit. */
- __IO uint8_t setup_pkt : 1; /* The CPU sets this bit,at the TxPktRdy bit is set,to send a SETUP token instead
- * of an OUT token for the transaction. Note: Setting this bit also clear the Data
- * Toggle.
- */
- __IO uint8_t error : 1; /* This bit will be set when three attempts have been made to perform a transaction
- * with no response from the peripheral.The CPU should clear this bit.An interrupt
- * is generated when this bit is set.
- */
- __IO uint8_t req_pkt : 1; /* The CPU sets this bit to request an IN transaction.
- * It is cleared when RxPktRdy is set.
- */
- __IO uint8_t status_pkt : 1; /* The CPU sets this bit at the same time as the TxPktRdy or ReqPkt bit is set,
- * to perform a status stage transaction. Setting this bit ensures that the data
- * toggle is set to 1 so that a DATA1 packet is used for the Status Stage transaction.
- */
- __IO uint8_t nak_timeout : 1; /* This bit will be set when Endpoint 0 is halted following the receipt for longer
- * than the time set by the NAKLimit0 register. The CPU should clear this bit to allow
- * the endpoint to continue.
- */
- } CSR0L_HOST_b;
- struct
- {
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO. */
- __IO uint8_t fifo_not_empty : 1; /* The USB sets this bit when there is at least 1 packet in the TX FIFO. */
- __IO uint8_t under_run : 1; /* The USB sets this bit if an IN token is received when TxPktRdy is not set. The CPU should clear this bit. */
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the latest packet from the endpoint TX FIFO */
- __IO uint8_t send_stall : 1; /* The CPU writes a 1 to this bit to issue a STALL handshake to an IN token.The CPU
- * clears this bit to terminate the stall condition.
- * Note:This bit has no effect where the endpoint is being used for Isochronous transfers.
- */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted.The FIFO is flushed and
- * the TxPktRdy bit is cleared(see below).The CPU should clear this bit.
- */
- __IO uint8_t clr_data_tog : 1; /* The CPU writes a 1 to this bit to reset the endpoint data toggle to 0. */
- __IO uint8_t incomp_tx : 1; /* When the endpoint is being used for high-bandwidth Isochronous,this bit is set to
- * indicate where a large packet has been split into 2 or 3 packets for transmission
- * but insufficient IN tokens have been received to send all the parts.
- * Note:In anything other than isochronous transfers,this bit will always return 0.
- */
- } TXCSRL_DEV_b;
- struct
- {
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO. */
- __IO uint8_t fifo_not_empty : 1; /* The USB sets this bit when there is at least 1 packet in the TX FIFO. */
- __IO uint8_t error : 1;
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the latest packet from the endpoint TX FIFO */
- __IO uint8_t setup_Pkt : 1;
- __IO uint8_t Rx_stall : 1;
- __IO uint8_t clr_data_tog : 1; /* The CPU writes a 1 to this bit to reset the endpoint data toggle to 0. */
- __IO uint8_t NAK_timeout_incompTx : 1;
- } TXCSRL_HOST_b;
- };
- union
- {
- __IO uint8_t CSR0H;
- __IO uint8_t TXCSRH;
- struct
- {
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the next packet to be transmitted/read from
- * the Endpoint 0 FIFO. The FIFO pointer is reset and the TxPktRdy/RxPktRdy bit(below) is
- * cleared. Note:FlushFIFO should only be used when TxPktRdy/RxPktRdy is set.At other
- * times, it may cause data to be corrupted.
- */
- __IO uint8_t reserved1_7 : 7; /* Unused. Return 0 when resd. */
- } CSR0H_DEV_b;
- struct
- {
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the next packet to be transmitted/read from
- * the Endpoint 0 FIFO. The FIFO pointer is reset and the TxPktRdy/RxPktRdy bit(below) is
- * cleared. Note:FlushFIFO should only be used when TxPktRdy/RxPktRdy is set.At other
- * times, it may cause data to be corrupted.
- */
- __IO uint8_t data_toggle : 1; /* When read,this bit indicates the current state of the Endpoint 0 data toggle. If D10
- * is high,this bit may be written with the written with the required setting of the data
- * toggle.If D10 is low,any value written to this bit is ignored.
- */
- __IO uint8_t data_toggle_wr_en : 1; /* The CPU written a 1 to this bit to enable the current state of Endpoint 0 data toggle
- * to be written(see Data Toggle bit,below).This bit is automatically cleared once the new
- * value is written.
- */
- __IO uint8_t dis_ping : 1; /* The CPU writes a 1 to this bit to instruct the core not to issue PING tokens in data
- * and status phases of a high-speed Control transfer(for use with devices that do not
- * respond to PING).
- */
- __IO uint8_t reserved1_7 : 4; /* Unused. Return 0 when resd. */
- } CSR0H_HOST_b;
- struct
- {
- __IO uint8_t reserved0_1 : 2;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t frc_data_tog : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t mode : 1;
- __IO uint8_t iso : 1;
- __IO uint8_t auto_set : 1;
- } TXCSRH_DEV_b;
- struct
- {
- __IO uint8_t data_toggle : 1;
- __IO uint8_t data_toggle_wren : 1;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t frc_data_tog : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t mode : 1;
- __IO uint8_t reserved6 : 1;
- __IO uint8_t auto_set : 1;
- } TXCSRH_HOST_b;
- };
- union
- {
- __IO uint16_t RXMAXP;
- struct
- {
- __IO uint16_t max_payload_tran : 11;
- __IO uint16_t ex_max : 5;
- } RXMAXP_b;
- };
- union
- {
- __IO uint8_t RXCSRL;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received */
- __IO uint8_t fifo_full : 1; /* */
- __IO uint8_t over_run : 1; /* */
- __IO uint8_t data_error : 1; /* */
- __IO uint8_t flush_fifo : 1;
- __IO uint8_t send_stall : 1; /* The CPU writes a 1 to this bit to issue a STALL handshake. */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted. The CPU should clear this bit. */
- __IO uint8_t clr_data_tog : 1;
- } RXCSRL_DEV_b;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received */
- __IO uint8_t fifo_full : 1; /* */
- __IO uint8_t error : 1; /* */
- __IO uint8_t data_error : 1; /* */
- __IO uint8_t flush_fifo : 1;
- __IO uint8_t ReqPkt : 1;
- __IO uint8_t RxStall : 1;
- __IO uint8_t clr_data_tog : 1;
- } RXCSRL_HOST_b;
- };
- union
- {
- __IO uint8_t RXCSRH;
- struct
- {
- __IO uint8_t incomp_rx : 1;
- __IO uint8_t reserved1_2 : 2;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t dis_nyet_pid_error : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t iso : 1;
- __IO uint8_t auto_clear : 1;
- } RXCSRH_DEV_b;
- struct
- {
- __IO uint8_t incomp_rx : 1;
- __IO uint8_t data_toggle : 1;
- __IO uint8_t data_toggle_wren : 1;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t PID_error : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t auto_req : 1;
- __IO uint8_t auto_clear : 1;
- } RXCSRH_HOST_b;
- };
- union
- {
- __IO uint8_t COUNT0;
- __IO uint16_t RXCOUNT;
- struct
- {
- __IO uint8_t ep0_rx_count : 7;
- __IO uint8_t reserved7 : 1;
- } COUNT0_b;
- };
- union
- {
- __IO uint8_t TYPE0; // Host Mode Only.
- __IO uint8_t TXTYPE; // Host Mode Only.
- struct
- {
- __IO uint8_t reserved0_5 : 6; /* Reserved */
- __IO uint8_t speed : 2; /* Operating speed of the target device :
- * 00:Unused(Note: If selected,the target will be using the same connectionn speed as the core.)
- * 01:High
- * 10:Full
- * 11:Low
- */
- } TYPE0_b;
- struct
- {
- __IO uint8_t target_EP_number : 4; /* Operating speed of the target device when the core is configured with the
- * multipoint option:
- * 00: Unused 01: High
- * 10: Full 11: Low
- * When the core is not configured with the multipoint option these bits should
- * not be accessed.
- */
- __IO uint8_t protocol : 2; /* The CPU should set this to select the required protocol for TX endpoint:
- * 00: Control 01: Isochronous
- * 10: Bulk 11: Interrupt
- */
- __IO uint8_t speed : 2; /* Operating speed of the target device when the core is configured with
- * the multipoint option:
- * 00:Unused 01: High 10: Full 11:Low
- * when the core is not configured with the multipoint option these bits
- * should not be accessed.
- */
- } TXTYPE_b;
- };
- union
- {
- __IO uint8_t NAKLIMIT0; // Host Mode Only.
- __IO uint8_t TXINTERVAL; // Host Mode Only.
- struct
- {
- __IO uint8_t Endpoint0_NAK_Limit : 5; /* Endpoint 0 NAK limit (m) */
- __IO uint8_t reserved5_7 : 3; /* Reserve */
- } NAKLIMIT0_b;
- struct
- {
- __IO uint8_t Tx_polling_interval :8;
- } TXINTERVAL_b;
- };
- union
- {
- __IO uint8_t RXTYPE; // Host Mode Only.
- struct
- {
- __IO uint8_t target_EP_number : 4; /* Operating speed of the target device when the core is configured with the
- * multipoint option:
- * 00: Unused 01: High
- * 10: Full 11: Low
- * When the core is not configured with the multipoint option these bits should
- * not be accessed.
- */
- __IO uint8_t protocol : 2; /* The CPU should set this to select the required protocol for TX endpoint:
- * 00: Control 01: Isochronous
- * 10: Bulk 11: Interrupt
- */
- __IO uint8_t speed : 2; /* Operating speed of the target device when the core is configured with
- * the multipoint option:
- * 00:Unused 01: High 10: Full 11:Low
- * when the core is not configured with the multipoint option these bits
- * should not be accessed.
- */
- } RXTYPE_b;
- };
- __IO uint8_t RXINTERVAL; // Host Mode Only.
- uint8_t UNUSED0;
- union
- {
- __IO uint8_t CONFIGDATA;
- __IO uint8_t FIFOSIZE;
- struct
- {
- __IO uint8_t utmi_data_width : 1; /* Indicates selected UTMI+ data width. Always 0 indicating 8 bits. */
- __IO uint8_t soft_cone : 1; /* Always "1" . Indicates Soft Connect/Disconnect. */
- __IO uint8_t dyn_fifo_sizing : 1; /* When set to "1" indicates Dynamic FIFO Sizing option selected. */
- __IO uint8_t hb_txe : 1; /* When set to "1" indicates High-bandwidth TX ISO Endpoint Support selected */
- __IO uint8_t hb_rxe : 1; /* When set to "1" indicates High-bandwidth Rx ISO Endpoint Support selected. */
- __IO uint8_t big_endian : 1; /* Always "0". Indicates Little Endian ordering. */
- __IO uint8_t mp_txe : 1; /* When set to "1" automatic splitting of bulk packets is selected */
- __IO uint8_t mp_rxe : 1; /* When set to "1" automatic amalgamation of bulk packets is selected */
- } CONFIGDATA_b;
- struct
- {
- __IO uint8_t tx_fifo_size : 4;
- __IO uint8_t rx_fifo_size : 4;
- } b;
- };
- union
- {
- // FIFOS, EP0 - EP15 0x20 - 0x5F.
- __IO uint8_t byte;
- __IO uint16_t word;
- __IO uint32_t dword;
- } FIFOX[16];
- // OTG, DynFIFO + Version. 0x60 - 0x6F.
- union
- {
- __IO uint8_t DEVCTL;
- struct
- {
- __IO uint8_t session : 1; /* When operation as an 'A' device,this bit is set or cleared by the CPU to
- * start or end a session. When operating as a 'B' device,this bit is set/cleared
- * by the MUSBMHDRC when a session starts/ends. It is also set by the CPU to initiate
- * the Session Request Protocol.When the MUSBMHDRC is in Suspend mode,the bit may be
- * cleared by the CPU to perform a software disconnect.Note:Clearing this bit when the
- * core is not suspended will result in undefined behavior.
- */
- __IO uint8_t host_req : 1; /* When set,the MUSBMHDRC will initiate the Host Negotiation when Suspend
- * mode is entered.It is cleared when Host Negotiation is completed.
- */
- __IO uint8_t host_mode : 1; /* This Read-only bit is set when the MUSBMHDRC is acting as a Host. */
- __IO uint8_t VBus : 2; /* These Read-only bits encode the current VBus level as follows:
- * D4 D3 Meaning
- * 0 0 Below SessionEnd
- * 0 1 Above SessionEnd,below AValid
- * 1 0 Above AValid,below VBus Valid
- * 1 1 Above VBus Valid
- */
- __IO uint8_t LSDev : 1; /* This Read-only bit is set when a low-speed device has been detected being
- * connected to the port. Only valid in Host mode.
- */
- __IO uint8_t FSDev : 1; /* This Read-only bit is set when a full-speed or high-speed device has been
- * detected being connected to the port.(High-speed device are distinguished
- * from full-speed by checking for high-speed chirps when the device is reset.)
- * Only valid in Host mode.
- */
- __IO uint8_t B_Device : 1; /* This Read-only bit indicates whether the MUSBMHDRC is operating
- * as the 'A' device or the 'B' device.
- * 0 => 'A' device; 1 => 'B' device.
- * Only valid while a session is in progress. To determine the role
- * when no session is in progress, set the session bit and read this bit.
- * NOTE: If the core is in Force_Host mode(i.e. a session has been started
- * with Testmode.D7 = 1),this bit will indicate the state of the HOSTDISCON
- * input signal from the PHY.
- */
- } DEVCTL_b;
- };
- union
- {
- __IO uint8_t MISC;
- struct
- {
- __IO uint8_t rx_edma : 1; /* 1'b0:DMA_REQ signal for all OUT Endpoints will be de-asserted when MAXP
- * bytes have been read to an endpoint.This is late mode.
- * 1'b1:DMA_REQ signal for all OUT Endpoints will be de-asserted when MAXP-8
- * bytes have been read to an endpoint.This is early mode.
- */
- __IO uint8_t tx_edma : 1; /* 1'b0:DMA_REQ signal for all IN Endpoints will be de-asserted when MAXP
- * bytes have been written to an endpoint.This is late mode.
- * 1'b1:DMA_REQ signal for all IN Endpoints will be de-asserted when MAXP-8
- * bytes have been written to an endpoint.This is early mode.
- */
- __IO uint8_t reserved2_7 : 6; /* These bits are reserved. */
- } MISC_b;
- };
- union
- {
- __IO uint8_t TXFIFOSZ;
- struct
- {
- __IO uint8_t size : 4;
- __IO uint8_t double_packet_buffer : 1;
- __IO uint8_t reserved5_7 : 3;
- } TXFIFOSZ_b;
- };
- union
- {
- __IO uint8_t RXFIFOSZ;
- struct
- {
- __IO uint8_t size : 4;
- __IO uint8_t double_packet_buffer : 1;
- __IO uint8_t reserved5_7 : 3;
- } RXFIFOSZ_b;
- };
- __IO uint16_t TXFIFOADD;
- __IO uint16_t RXFIFOADD;
- union
- {
- __O uint32_t VCONTROL;
- __IO uint32_t VSTATUS;
- }VCONTROL_VSTATUS;
- union
- {
- __IO uint16_t HWVERS;
- struct
- {
- __IO uint16_t minor_version_number : 10;
- __IO uint16_t major_version_number : 5;
- __IO uint16_t rc : 1;
- } HWVERS_b;
- };
- uint8_t UNUSED1[2];
- // ULPI & Addnl. Config. registers. 0x70 - 0x7F.
- __IO uint8_t ULPIVBUSCONTROL;
- __IO uint8_t ULPICARKITCONTROL;
- __IO uint8_t ULPIINTMASK;
- __IO uint8_t ULPIINTSRC;
- __IO uint8_t ULPIREGDATA;
- __IO uint8_t ULPIREGADDR;
- __IO uint8_t ULPIREGCONTROL;
- __IO uint8_t ULPIRAWDATA;
- union
- {
- __IO uint8_t EPINFO;
- struct
- {
- __IO uint8_t tx_endpoint : 4;
- __IO uint8_t rx_endpoint : 4;
- } EPINFO_b;
- };
- union
- {
- __IO uint8_t RAMINFO;
- struct
- {
- __IO uint8_t ram_bits : 4;
- __IO uint8_t dma_chans : 4;
- } RAMINFO_b;
- };
- union
- {
- __IO uint8_t LINKINFO;
- struct
- {
- __IO uint8_t wtid : 4;
- __IO uint8_t wtcon : 4;
- } LINKINFO_b;
- };
- __IO uint8_t VPLEN;
- __IO uint8_t HS_EOF1;
- __IO uint8_t FS_EOF1;
- __IO uint8_t LS_EOF1;
- union
- {
- __IO uint8_t SOFT_RST;
- struct
- {
- __IO uint8_t nrst : 1;
- __IO uint8_t nrstx : 1;
- __IO uint8_t reserved2_7 : 6;
- } SOFT_RST_b;
- };
- struct
- {
- // TADDR Epn (n = 0 - 15). 0x80 - 0xFF.
- __IO uint8_t TXFUNCADDR;
- uint8_t UNUSED0;
- __IO uint8_t TXHUBADDR;
- __IO uint8_t TXHUBPORT;
- __IO uint8_t RXFUNCADDR;
- uint8_t UNUSED1;
- __IO uint8_t RXHUBADDR;
- __IO uint8_t RXHUBPORT;
- } AMCS[16];
- struct
- {
- // CSR EPn (n = 0 - 15). 0x100 - 0x1FF;
- union
- {
- __IO uint16_t TXMAXP;
- struct
- {
- __IO uint16_t max_payload_tran : 11; /* Bits 10:0 define(in bytes)the maximum payload transmitted in single transaction.
- * The value set can be up to 1024 bytes but is subject to the constraints place by
- * the USB Specification on packet sizes for Bulk,Interrupt and Isochronous transfers
- * in Full-speed and High-speed operations.
- */
- __IO uint16_t ex_max : 5;
- } TXMAXP_b;
- };
- union
- {
- __IO uint8_t CSR0L;
- __IO uint8_t TXCSRL;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received. An interrupt is
- * generated when this bit is set. The CPU clear this bit by setting the
- * ServicedRxPktRdy bit.
- */
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bits after loading a data packet into the FIFO. It is clear
- * automatically when a data packet has been transmitted. An interrupt is also
- * generated at this point(if enabled).
- */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted.
- * The CPU should clear this bit.
- */
- __IO uint8_t data_end : 1; /* The CPU sets this bit:
- * 1. When setting TxPktRdy for the last data packet.
- * 2. When clearing RxPktRdy after unloading the last data packet.
- * 3. When setting TxPktRdy for zero length data packet.
- * It is cleared automatically.
- */
- __IO uint8_t setup_end : 1; /* This bit will be set when a control transaction ends before the DataEnd
- * bit has been set. An interrupt will be generated and the FIFO flushed at
- * this time.The bit is cleared by the CPU writing a 1 to the ServicedSetupEnd bit.
- */
- __IO uint8_t send_stall : 1; /* The CPU write a 1 to this bit to terminate the current transaction.
- * The STALL handshake will be transmitted and then this bit will be
- * cleared automatically.
- */
- __IO uint8_t serviced_rxpktrdy : 1; /* The CPU write a 1 to this bit to clear the RxPktRdy bit.
- * It is Cleared automatically.
- */
- __IO uint8_t serviced_setupend : 1; /* The CPU write a 1 to this bit to clear the SetupEnd bit.
- * It is Cleared automatically.
- */
- } CSR0L_DEV_b;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received.An interrupt is generated
- * (If enabled)when this bit set.The CPU should clear this bit when the packet has
- * been read from the FIFO.
- */
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO.It is cleared
- * automatically when a data packet has been transmitted. An interrupt is also
- * generated at this point(If enabled).
- */
- __IO uint8_t rx_stall : 1; /* This bit is set when a STALL handshake is received. The CPU should clear this bit. */
- __IO uint8_t setup_pkt : 1; /* The CPU sets this bit,at the TxPktRdy bit is set,to send a SETUP token instead
- * of an OUT token for the transaction. Note: Setting this bit also clear the Data
- * Toggle.
- */
- __IO uint8_t error : 1; /* This bit will be set when three attempts have been made to perform a transaction
- * with no response from the peripheral.The CPU should clear this bit.An interrupt
- * is generated when this bit is set.
- */
- __IO uint8_t req_pkt : 1; /* The CPU sets this bit to request an IN transaction.
- * It is cleared when RxPktRdy is set.
- */
- __IO uint8_t status_pkt : 1; /* The CPU sets this bit at the same time as the TxPktRdy or ReqPkt bit is set,
- * to perform a status stage transaction. Setting this bit ensures that the data
- * toggle is set to 1 so that a DATA1 packet is used for the Status Stage transaction.
- */
- __IO uint8_t nak_timeout : 1; /* This bit will be set when Endpoint 0 is halted following the receipt for longer
- * than the time set by the NAKLimit0 register. The CPU should clear this bit to allow
- * the endpoint to continue.
- */
- } CSR0L_HOST_b;
- struct
- {
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO. */
- __IO uint8_t fifo_not_empty : 1; /* The USB sets this bit when there is at least 1 packet in the TX FIFO. */
- __IO uint8_t under_run : 1; /* The USB sets this bit if an IN token is received when TxPktRdy is not set. The CPU should clear this bit. */
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the latest packet from the endpoint TX FIFO */
- __IO uint8_t send_stall : 1; /* The CPU writes a 1 to this bit to issue a STALL handshake to an IN token.The CPU
- * clears this bit to terminate the stall condition.
- * Note:This bit has no effect where the endpoint is being used for Isochronous transfers.
- */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted.The FIFO is flushed and
- * the TxPktRdy bit is cleared(see below).The CPU should clear this bit.
- */
- __IO uint8_t clr_data_tog : 1; /* The CPU writes a 1 to this bit to reset the endpoint data toggle to 0. */
- __IO uint8_t incomp_tx : 1; /* When the endpoint is being used for high-bandwidth Isochronous,this bit is set to
- * indicate where a large packet has been split into 2 or 3 packets for transmission
- * but insufficient IN tokens have been received to send all the parts.
- * Note:In anything other than isochronous transfers,this bit will always return 0.
- */
- } TXCSRL_DEV_b;
- struct
- {
- __IO uint8_t tx_pkt_rdy : 1; /* The CPU sets this bit after loading a data packet into the FIFO. */
- __IO uint8_t fifo_not_empty : 1; /* The USB sets this bit when there is at least 1 packet in the TX FIFO. */
- __IO uint8_t error : 1;
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the latest packet from the endpoint TX FIFO */
- __IO uint8_t setup_Pkt : 1;
- __IO uint8_t Rx_stall : 1;
- __IO uint8_t clr_data_tog : 1; /* The CPU writes a 1 to this bit to reset the endpoint data toggle to 0. */
- __IO uint8_t NAK_timeout_incompTx : 1;
- } TXCSRL_HOST_b;
- };
- union
- {
- __IO uint8_t CSR0H;
- __IO uint8_t TXCSRH;
- struct
- {
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the next packet to be transmitted/read from
- * the Endpoint 0 FIFO. The FIFO pointer is reset and the TxPktRdy/RxPktRdy bit(below) is
- * cleared. Note:FlushFIFO should only be used when TxPktRdy/RxPktRdy is set.At other
- * times, it may cause data to be corrupted.
- */
- __IO uint8_t reserved1_7 : 7; /* Unused. Return 0 when resd. */
- } CSR0H_DEV_b;
- struct
- {
- __IO uint8_t flush_fifo : 1; /* The CPU writes a 1 to this bit to flush the next packet to be transmitted/read from
- * the Endpoint 0 FIFO. The FIFO pointer is reset and the TxPktRdy/RxPktRdy bit(below) is
- * cleared. Note:FlushFIFO should only be used when TxPktRdy/RxPktRdy is set.At other
- * times, it may cause data to be corrupted.
- */
- __IO uint8_t data_toggle : 1; /* When read,this bit indicates the current state of the Endpoint 0 data toggle. If D10
- * is high,this bit may be written with the written with the required setting of the data
- * toggle.If D10 is low,any value written to this bit is ignored.
- */
- __IO uint8_t data_toggle_wr_en : 1; /* The CPU written a 1 to this bit to enable the current state of Endpoint 0 data toggle
- * to be written(see Data Toggle bit,below).This bit is automatically cleared once the new
- * value is written.
- */
- __IO uint8_t dis_ping : 1; /* The CPU writes a 1 to this bit to instruct the core not to issue PING tokens in data
- * and status phases of a high-speed Control transfer(for use with devices that do not
- * respond to PING).
- */
- __IO uint8_t reserved1_7 : 4; /* Unused. Return 0 when resd. */
- } CSR0H_HOST_b;
- struct
- {
- __IO uint8_t reserved0_1 : 2;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t frc_data_tog : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t mode : 1;
- __IO uint8_t iso : 1;
- __IO uint8_t auto_set : 1;
- } TXCSRH_DEV_b;
- struct
- {
- __IO uint8_t data_toggle : 1;
- __IO uint8_t data_toggle_wren : 1;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t frc_data_tog : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t mode : 1;
- __IO uint8_t reserved6 : 1;
- __IO uint8_t auto_set : 1;
- } TXCSRH_HOST_b;
- };
- union
- {
- __IO uint16_t RXMAXP;
- struct
- {
- __IO uint16_t max_payload_tran : 11;
- __IO uint16_t ex_max : 5;
- } RXMAXP_b;
- };
- union
- {
- __IO uint8_t RXCSRL;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received */
- __IO uint8_t fifo_full : 1; /* */
- __IO uint8_t over_run : 1; /* */
- __IO uint8_t data_error : 1; /* */
- __IO uint8_t flush_fifo : 1;
- __IO uint8_t send_stall : 1; /* The CPU writes a 1 to this bit to issue a STALL handshake. */
- __IO uint8_t sent_stall : 1; /* This bit is set when a STALL handshake is transmitted. The CPU should clear this bit. */
- __IO uint8_t clr_data_tog : 1;
- } RXCSRL_DEV_b;
- struct
- {
- __IO uint8_t rx_pkt_rdy : 1; /* This bit is set when a data packet has been received */
- __IO uint8_t fifo_full : 1; /* */
- __IO uint8_t error : 1; /* */
- __IO uint8_t data_error : 1; /* */
- __IO uint8_t flush_fifo : 1;
- __IO uint8_t ReqPkt : 1;
- __IO uint8_t RxStall : 1;
- __IO uint8_t clr_data_tog : 1;
- } RXCSRL_HOST_b;
- };
- union
- {
- __IO uint8_t RXCSRH;
- struct
- {
- __IO uint8_t incomp_rx : 1;
- __IO uint8_t reserved1_2 : 2;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t dis_nyet_pid_error : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t iso : 1;
- __IO uint8_t auto_clear : 1;
- } RXCSRH_DEV_b;
- struct
- {
- __IO uint8_t incomp_rx : 1;
- __IO uint8_t data_toggle : 1;
- __IO uint8_t data_toggle_wren : 1;
- __IO uint8_t dma_req_mode : 1;
- __IO uint8_t PID_error : 1;
- __IO uint8_t dma_req_enab : 1;
- __IO uint8_t auto_req : 1;
- __IO uint8_t auto_clear : 1;
- } RXCSRH_HOST_b;
- };
- union
- {
- __IO uint16_t RXCOUNT;
- struct
- {
- __IO uint16_t ep_rx_count : 14;
- __IO uint16_t reserved14_15 : 2;
- } RXCOUNT_b;
- };
- union
- {
- __IO uint8_t TYPE0; // Host Mode Only.
- __IO uint8_t TXTYPE; // Host Mode Only.
- struct
- {
- __IO uint8_t reserved0_5 : 6; /* Reserved */
- __IO uint8_t speed : 2; /* Operating speed of the target device :
- * 00:Unused(Note: If selected,the target will be using the same connectionn speed as the core.)
- * 01:High
- * 10:Full
- * 11:Low
- */
- } TYPE0_b;
- struct
- {
- __IO uint8_t target_EP_number : 4; /* Operating speed of the target device when the core is configured with the
- * multipoint option:
- * 00: Unused 01: High
- * 10: Full 11: Low
- * When the core is not configured with the multipoint option these bits should
- * not be accessed.
- */
- __IO uint8_t protocol : 2; /* The CPU should set this to select the required protocol for TX endpoint:
- * 00: Control 01: Isochronous
- * 10: Bulk 11: Interrupt
- */
- __IO uint8_t speed : 2; /* Operating speed of the target device when the core is configured with
- * the multipoint option:
- * 00:Unused 01: High 10: Full 11:Low
- * when the core is not configured with the multipoint option these bits
- * should not be accessed.
- */
- } TXTYPE_b;
- };
- union
- {
- __IO uint8_t NAKLIMIT0; // Host Mode Only.
- __IO uint8_t TXINTERVAL; // Host Mode Only.
- struct
- {
- __IO uint8_t Endpoint0_NAK_Limit : 5; /* Endpoint 0 NAK limit (m) */
- __IO uint8_t reserved5_7 : 3; /* Reserve */
- } NAKLIMIT0_b;
- struct
- {
- __IO uint8_t Tx_polling_interval :8;
- } TXINTERVAL_b;
- };
- union
- {
- __IO uint8_t RXTYPE; // Host Mode Only.
- struct
- {
- __IO uint8_t target_EP_number : 4; /* Operating speed of the target device when the core is configured with the
- * multipoint option:
- * 00: Unused 01: High
- * 10: Full 11: Low
- * When the core is not configured with the multipoint option these bits should
- * not be accessed.
- */
- __IO uint8_t protocol : 2; /* The CPU should set this to select the required protocol for TX endpoint:
- * 00: Control 01: Isochronous
- * 10: Bulk 11: Interrupt
- */
- __IO uint8_t speed : 2; /* Operating speed of the target device when the core is configured with
- * the multipoint option:
- * 00:Unused 01: High 10: Full 11:Low
- * when the core is not configured with the multipoint option these bits
- * should not be accessed.
- */
- } RXTYPE_b;
- };
- union
- {
- __IO uint8_t RXINTERVAL; // Host Mode Only.
- struct
- {
- __IO uint8_t Tx_polling_interval :8;
- } RXINTERVAL_b;
- };
- uint8_t UNUSED0;
- union
- {
- __IO uint8_t CONFIGDATA;
- __IO uint8_t FIFOSIZE;
- struct
- {
- __IO uint8_t utmi_data_width : 1; /* Indicates selected UTMI+ data width. Always 0 indicating 8 bits. */
- __IO uint8_t soft_cone : 1; /* Always "1" . Indicates Soft Connect/Disconnect. */
- __IO uint8_t dyn_fifo_sizing : 1; /* When set to "1" indicates Dynamic FIFO Sizing option selected. */
- __IO uint8_t hb_txe : 1; /* When set to "1" indicates High-bandwidth TX ISO Endpoint Support selected */
- __IO uint8_t hb_rxe : 1; /* When set to "1" indicates High-bandwidth Rx ISO Endpoint Support selected. */
- __IO uint8_t big_endian : 1; /* Always "0". Indicates Little Endian ordering. */
- __IO uint8_t mp_txe : 1; /* When set to "1" automatic splitting of bulk packets is selected */
- __IO uint8_t mp_rxe : 1; /* When set to "1" automatic amalgamation of bulk packets is selected */
- } CONFIGDATA_b;
- struct
- {
- __IO uint8_t tx_fifo_size : 4;
- __IO uint8_t rx_fifo_size : 4;
- } b;
- };
- } CSR[16];
- // Optional DMA Registers. 0x200 - 0x2FF.
- __IO uint32_t DMA_INTR; /* Only one DMA INTR register */
- __IO uint32_t DMA_CNTL;
- __IO uint32_t DMA_ADDR;
- __IO uint32_t DMA_COUNT;
- uint32_t UNUSED2[60];
- // Extended Registers. 0x300 - 0x35F.
- __IO uint16_t RQPKTCOUNT[16]; // Host Mode Only.
- uint16_t UNUSEDRQPK[16];
- union
- {
- __IO uint16_t RXDPKTBUFDIS; // Rx DPktBufDis.
- struct
- {
- __IO uint16_t reserved0 : 1;
- __IO uint16_t ep1_rx_dis : 1;
- __IO uint16_t ep2_rx_dis : 1;
- __IO uint16_t ep3_rx_dis : 1;
- __IO uint16_t ep4_rx_dis : 1;
- __IO uint16_t ep5_rx_dis : 1;
- __IO uint16_t ep6_rx_dis : 1;
- __IO uint16_t ep7_rx_dis : 1;
- __IO uint16_t ep8_rx_dis : 1;
- __IO uint16_t ep9_rx_dis : 1;
- __IO uint16_t ep10_rx_dis : 1;
- __IO uint16_t ep11_rx_dis : 1;
- __IO uint16_t ep12_rx_dis : 1;
- __IO uint16_t ep13_rx_dis : 1;
- __IO uint16_t ep14_rx_dis : 1;
- __IO uint16_t ep15_rx_dis : 1;
- } RXDPKTBUFDIS_b;
- };
- union
- {
- __IO uint16_t TXDPKTBUFDIS; // Tx DPktBufDis.
- struct
- {
- __IO uint16_t reserved0 : 1;
- __IO uint16_t ep1_tx_dis : 1;
- __IO uint16_t ep2_tx_dis : 1;
- __IO uint16_t ep3_tx_dis : 1;
- __IO uint16_t ep4_tx_dis : 1;
- __IO uint16_t ep5_tx_dis : 1;
- __IO uint16_t ep6_tx_dis : 1;
- __IO uint16_t ep7_tx_dis : 1;
- __IO uint16_t ep8_tx_dis : 1;
- __IO uint16_t ep9_tx_dis : 1;
- __IO uint16_t ep10_tx_dis : 1;
- __IO uint16_t ep11_tx_dis : 1;
- __IO uint16_t ep12_tx_dis : 1;
- __IO uint16_t ep13_tx_dis : 1;
- __IO uint16_t ep14_tx_dis : 1;
- __IO uint16_t ep15_tx_dis : 1;
- } TXDPKTBUFDIS_b;
- };
- __IO uint16_t C_T_UCH;
- __IO uint16_t C_T_HSRTN;
- __IO uint16_t C_T_HSBT;
- uint16_t UNUSED3[11];
- // LPM Registers. 0x360 - 0x365.
- union
- {
- __IO uint16_t LPM_ATTR;
- struct
- {
- __IO uint16_t link_state : 4; /* This value is provoided by the host to the peripheral to indicate what state the peripheral
- * must transition to after the receipt and acceptance of a LPM transaction.
- * LinkState = 4'h0 - Reserved
- * LinkState = 4'h1 - Slep State(L1)
- * LinkState = 4'h2 - Reserved
- * LinkState = 4'h3 - Reserved
- */
- __IO uint16_t HIRD : 4; /* This is the Host Initiated Resume Duration.This value is the minimum time the host will
- * drive resume on the Bus. The value in this register corresponds to an actual resume time
- * of:
- * Resume Time = 50us + HIRD * 75us.This results a range 50us to 1200us.
- */
- __IO uint16_t RmtWak : 1; /* This bit is the remote wakeup enable bit:
- * RmtWak = 1'b0:Remote wakeup is not enabled.
- * RmtWak = 1'b1:Remote wakeup is enabled.
- * This bit is applied on a temporary basis only and is only applied to the current suspend
- * state.After the current suspend cycle,the remote wakeup capability that was negotiated
- * upon enumeration will apply.
- */
- __IO uint16_t reserved9_11 : 3; /* Reserved;Always returns 0 on read */
- __IO uint16_t EndPoint : 4; /* This is the EndPnt that in the Token Packet of the LPM transaction. -*/
- } LPM_ATTR_b;
- };
- union
- {
- __IO uint8_t LPM_CNTRL;
- struct
- {
- __IO uint8_t lpmxmt : 1;
- __IO uint8_t lpmres : 1;
- __IO uint8_t lpmen : 2;
- __IO uint8_t lpmnak : 1;
- __IO uint8_t reserved5_7 : 3;
- } LPM_CNTRL_DEV_b;
- struct
- {
- __IO uint8_t lpmxmt : 1;
- __IO uint8_t lpmres : 1;
- __IO uint8_t reserved2_7 : 6;
- } LPM_CNTRL_HOST_b;
- };
- union
- {
- __IO uint8_t LPM_INTREN;
- struct
- {
- __IO uint8_t lpmxmt : 1;
- __IO uint8_t lpmres : 1;
- __IO uint8_t reserved2_7 : 6;
- } LPM_INTREN_b;
- };
- union
- {
- __IO uint8_t LPM_INTR;
- struct
- {
- __IO uint8_t lpmst : 1;
- __IO uint8_t lpmny : 1;
- __IO uint8_t lpmack : 1;
- __IO uint8_t lpmnc : 1;
- __IO uint8_t lpmres : 1;
- __IO uint8_t lpmerr : 1;
- __IO uint8_t reserved6_7 : 2;
- } LPM_INTR_DEV_b;
- struct
- {
- __IO uint8_t lpmst : 1;
- __IO uint8_t lpmny : 1;
- __IO uint8_t lpmack : 1;
- __IO uint8_t lpmnc : 1;
- __IO uint8_t lpmres : 1;
- __IO uint8_t reserved5_7 : 3;
- } LPM_INTR_HOST_b;
- };
- union
- {
- __IO uint8_t LPM_FADDR; // Relavant in Host mode only.
- struct
- {
- __IO uint8_t function_address : 7;
- __IO uint8_t reserved7 : 1;
- } LPM_FADDR_b;
- };
- }USB_TypeDef;
- #define USB_OTG ( (USB_TypeDef *) USB_BASE )
- typedef struct
- {
- const USB_TypeDef *RegBase;
- const int IrqLine;
- USB_EndpointCtrlStruct EpCtrl[USB_EP_MAX];
- uint32_t RxData[USB_FIFO_DW_DAX];
- PV_Union pRxData;
- uint8_t IsConnect;
- uint8_t IsHost;
- uint8_t NewDeviceAddress;
- }USB_HWCtrlStruct;
- static USB_HWCtrlStruct prvUSB =
- {
- .RegBase = USB_BASE,
- .IrqLine = USB_IRQn,
- };
- static uint8_t USB_OTG_FifosizeReg(uint16_t fifosiz)
- {
- uint8_t register_value = 0;
- switch (fifosiz)
- {
- case 8:
- register_value = 0;
- break;
- case 16:
- register_value = 1;
- break;
- case 32:
- register_value = 2;
- break;
- case 64:
- register_value = 3;
- break;
- case 128:
- register_value = 4;
- break;
- }
- return register_value;
- }
- static void prvUSB_IrqHandle(int32_t IrqLine, void *pData)
- {
- uint32_t USB_ID = (uint32_t)pData;
- uint32_t i;
- uint32_t Count32b;
- uint16_t RxLen;
- uint16_t TxBit = USB_OTG->INTRTX;
- uint16_t RxBit = USB_OTG->INTRRX;
- uint8_t StateBit = USB_OTG->INTRUSB;
- uint8_t EpIndex = 1;
- USB_OTG->INTRUSB = 0;
- USB_OTG->INTRRX = 0;
- USB_OTG->INTRTX = 0;
- if (prvUSB.IsHost || USB_OTG->DEVCTL_b.host_mode)
- {
- ;
- }
- else
- {
- if (StateBit & 0x1)
- {
- USB_StackDeviceBusChange(USB_ID, USBD_BUS_TYPE_SUSPEND);
- }
- if (StateBit & 0x2)
- {
- USB_StackDeviceBusChange(USB_ID, USBD_BUS_TYPE_RESUME);
- USB_OTG->POWER_b.resume = 1;
- }
- if (StateBit & 0x4)
- {
- USB_OTG->FADDR = 0;
- USB_OTG->INDEX = 0;
- USB_FlushFifo(&prvUSB, 0, 0);
- for(i = 1; i < 8; i++)
- {
- USB_FlushFifo(&prvUSB,i, 0);
- USB_FlushFifo(&prvUSB,i, 1);
- }
- USB_SetDeviceEPStatus(&prvUSB, 0, 0, USB_EP_STATE_ACK);
- USB_StackDeviceBusChange(USB_ID, USBD_BUS_TYPE_RESET);
- }
- if (StateBit & 0x8)
- {
- USB_StackDeviceBusChange(USB_ID, USBD_BUS_TYPE_NEW_SOF);
- }
- if (StateBit & 0x20)
- {
- for(i = 0; i < 8; i++)
- {
- memset(&prvUSB.EpCtrl[i].TxBuf, 0, sizeof(Buffer_Struct));
- }
- USB_StackDeviceBusChange(USB_ID, USBD_BUS_TYPE_DISCONNECT);
- }
- if (TxBit & 0x01)
- {
- if (USB_OTG->CSR0L_DEV_b.sent_stall)
- {
- USB_SetDeviceEPStatus(&prvUSB, 0, 0, USB_EP_STATE_ACK);
- }
- if (USB_OTG->CSR0L_DEV_b.setup_end)
- {
- USB_OTG->CSR0L_DEV_b.serviced_setupend = 1;
- }
- if (prvUSB.NewDeviceAddress & 0x80)
- {
- USB_OTG->FADDR = prvUSB.NewDeviceAddress & 0x7f;
- prvUSB.NewDeviceAddress = 0;
- }
- if (USB_OTG->CSR0L_DEV_b.rx_pkt_rdy)
- {
- RxLen = USB_OTG->COUNT0_b.ep0_rx_count;
- if (RxLen)
- {
- Count32b = RxLen >> 2;
- for (i = 0; i < Count32b; i++)
- {
- prvUSB.RxData[i] = USB_OTG->FIFOX[0].dword;
- }
- for (i = Count32b * 4; i < RxLen; i++)
- {
- prvUSB.pRxData.pu8[i] = USB_OTG->FIFOX[0].byte;
- }
- USB_StackPutRxData(USB_ID, 0, prvUSB.pRxData.pu8, RxLen);
- }
- USB_OTG->CSR0L_DEV_b.serviced_rxpktrdy = 1;
- USB_StackAnalyzeDeviceEpRx(USB_ID, 0);
- }
- else if (!USB_OTG->CSR0L_DEV_b.tx_pkt_rdy)
- {
- USB_DeviceXfer(&prvUSB, 0);
- }
- }
- else if (TxBit)
- {
- TxBit >>= 1;
- EpIndex = 1;
- while(TxBit)
- {
- if (TxBit & 0x01)
- {
- if (!USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.tx_pkt_rdy)
- {
- USB_DeviceXfer(&prvUSB, EpIndex);
- }
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.sent_stall = prvUSB.EpCtrl[EpIndex].INSTATUS_b.Halt?1:0;
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.send_stall = 0;
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.under_run = 0;
- }
- TxBit >>= 1;
- EpIndex++;
- }
- }
- if (RxBit)
- {
- EpIndex = 1;
- RxBit >>= 1;
- while(RxBit)
- {
- if (RxBit & 0x01)
- {
- if (USB_OTG->CSR[EpIndex].RXCSRL_DEV_b.rx_pkt_rdy)
- {
- RxLen = USB_OTG->CSR[EpIndex].RXCOUNT_b.ep_rx_count;
- if (RxLen)
- {
- Count32b = RxLen >> 2;
- for (i = 0; i < Count32b; i++)
- {
- prvUSB.RxData[i] = USB_OTG->FIFOX[EpIndex].dword;
- }
- for (i = Count32b * 4; i < RxLen; i++)
- {
- prvUSB.pRxData.pu8[i] = USB_OTG->FIFOX[EpIndex].byte;
- }
- USB_StackPutRxData(USB_ID, EpIndex, prvUSB.pRxData.pu8, RxLen);
- }
- }
- USB_OTG->CSR[EpIndex].RXCSRL = 0;
- USB_OTG->CSR[EpIndex].RXCSRL_DEV_b.sent_stall = prvUSB.EpCtrl[EpIndex].OUTSTATUS_b.Halt?1:0;
- USB_StackAnalyzeDeviceEpRx(USB_ID, EpIndex);
- }
- RxBit >>= 1;
- EpIndex++;
- }
- }
- }
- }
- static int prvUSB_SetupEPFifo(HANDLE hUSB)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- uint8_t i;
- uint8_t Len = 0;
- uint16_t FifoStart = (64 >> 3);
- uint16_t UseFifo = 64;
- //ep0使用默认的64byte
- USB_OTG->INDEX = 0;
- USB_OTG->TXFIFOSZ = 3;
- USB_OTG->RXFIFOSZ = 3;
- USB_OTG->TXFIFOADD = 0;
- USB_OTG->RXFIFOADD = 0;
- USB_OTG->CSR0H_DEV_b.flush_fifo = 1; //刷新EP0的FIFO
- hwUSB->EpCtrl[0].MaxPacketLen = 64;
- for(i = 1; i < USB_EP_MAX; i++)
- {
- USB_OTG->INDEX = i;
- if (hwUSB->EpCtrl[i].ToDeviceEnable)
- {
- Len = USB_OTG_FifosizeReg(hwUSB->EpCtrl[i].MaxPacketLen);
- USB_OTG->CSR[i].RXMAXP = hwUSB->EpCtrl[i].MaxPacketLen;
- USB_OTG->RXFIFOADD = FifoStart;
- USB_OTG->RXFIFOSZ = Len;
- USB_OTG->CSR[i].RXCSRL = (1 << 4);
- //DBG("%d,%d,%x,%d,%x", i, USB_OTG->CSR[i].RXMAXP, USB_OTG->RXFIFOADD, USB_OTG->RXFIFOSZ, USB_OTG->CSR[i].RXCSRL);
- FifoStart += (hwUSB->EpCtrl[i].MaxPacketLen >> 3);
- UseFifo += hwUSB->EpCtrl[i].MaxPacketLen;
- }
- if (UseFifo > 512)
- {
- DBG("to much fifo!");
- return -1;
- }
- if (hwUSB->EpCtrl[i].ToHostEnable)
- {
- USB_OTG->CSR[i].TXMAXP = hwUSB->EpCtrl[i].MaxPacketLen;
- USB_OTG->TXFIFOADD = FifoStart;
- USB_OTG->TXFIFOSZ = Len;
- USB_OTG->CSR[i].TXCSRL = (1 << 3);
- //DBG("%d,%d,%x,%d,%x", i, USB_OTG->CSR[i].TXMAXP, USB_OTG->TXFIFOADD, USB_OTG->TXFIFOSZ, USB_OTG->CSR[i].TXCSRL);
- FifoStart += (hwUSB->EpCtrl[i].MaxPacketLen >> 3);
- UseFifo += hwUSB->EpCtrl[i].MaxPacketLen;
- }
- if (UseFifo > 512)
- {
- DBG("to much fifo!");
- return -1;
- }
- }
- USB_OTG->INDEX = 0;
- return 0;
- }
- void USB_GlobalInit(void)
- {
- USB_HWCapsStruct Caps;
- ISR_SetHandler(prvUSB.IrqLine, prvUSB_IrqHandle, USB_ID0);
- #ifdef __BUILD_OS__
- ISR_SetPriority(prvUSB.IrqLine, IRQ_LOWEST_PRIORITY);
- #else
- ISR_SetPriority(prvUSB.IrqLine, 7);
- #endif
- prvUSB.IsConnect = 0;
- Caps.EpBufMaxLen = 4096;
- Caps.Feature = 0;
- Caps.FEATURE_b.FullSpeed = 1;
- Caps.CtrlMode = USB_MODE_DUAL;
- USB_StackSetControl(USB_ID0, &prvUSB, prvUSB.EpCtrl, &Caps);
- USB_StackSetDeviceSpeed(USB_ID0, USB_DEVICE_SPEED_FULL_SPEED);
- USB_OTG->INTRRXE = 0;
- USB_OTG->INTRTXE = 0;
- USB_OTG->INTRUSBE = 0;
- prvUSB.pRxData.pu32 = prvUSB.RxData;
- SYSCTRL->CG_CTRL2 &= ~SYSCTRL_AHBPeriph_USB;
- }
- void USB_PowerOnOff(HANDLE hUSB, uint8_t OnOff)
- {
- if (OnOff)
- {
- SYSCTRL->CG_CTRL2 |= SYSCTRL_AHBPeriph_USB;
- }
- else
- {
- SYSCTRL->CG_CTRL2 &= ~SYSCTRL_AHBPeriph_USB;
- }
- }
- void USB_Stop(HANDLE hUSB)
- {
- uint8_t dummy;
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- ISR_OnOff(hwUSB->IrqLine, 0);
- USB_OTG->POWER = 0;
- USB_OTG->INTRRXE = 0;
- USB_OTG->INTRTXE = 0;
- USB_OTG->INTRUSBE = 0;
- USB_OTG->INTRTX = 0;
- USB_OTG->INTRRX = 0;
- USB_OTG->INTRUSB = 0;
- dummy = USB_OTG->INTRUSB;
- }
- void USB_ResetStart(HANDLE hUSB)
- {
- SYSCTRL->LOCK_R &= ~SYSCTRL_USB_RESET;
- SYSCTRL->SOFT_RST2 |= SYSCTRL_USB_RESET;
- SYSCTRL->LOCK_R |= SYSCTRL_USB_RESET;
- }
- void USB_ResetEnd(HANDLE hUSB)
- {
- SYSCTRL->LOCK_R &= ~SYSCTRL_USB_RESET;
- SYSCTRL->SOFT_RST2 &= ~SYSCTRL_USB_RESET;
- SYSCTRL->LOCK_R |= SYSCTRL_USB_RESET;
- }
- void USB_SetWorkMode(HANDLE hUSB, uint8_t Mode)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- USBPHY_CR1_TypeDef CR1;
- USBPHY_CR3_TypeDef CR3;
- CR1.d32 = SYSCTRL->USBPHY_CR1;
- CR1.b.commononn = 0;
- CR1.b.stop_ck_for_suspend = 0;
- SYSCTRL->USBPHY_CR1 = CR1.d32;
- switch (Mode)
- {
- case USB_MODE_HOST:
- USB_OTG->POWER = 1;
- USB_OTG->DEVCTL |= (1 << 0)|(1 << 2);
- CR3.d32 = SYSCTRL->USBPHY_CR3;
- CR3.b.idpullup = 1;
- SYSCTRL->USBPHY_CR3 = CR3.d32;
- hwUSB->IsHost = 1;
- break;
- default:
- USB_OTG->DEVCTL &= ~((1 << 0)|(1 << 2));
- USB_OTG->POWER = 1|(1 << 6);
- CR3.d32 = SYSCTRL->USBPHY_CR3;
- CR3.b.idpullup = 0;
- SYSCTRL->USBPHY_CR3 = CR3.d32;
- hwUSB->IsHost = 0;
- break;
- }
- }
- void USB_SetDeviceAddress(HANDLE hUSB, uint8_t Address)
- {
- prvUSB.NewDeviceAddress = 0x80 | Address;
- }
- int USB_ReInitEpCfg(HANDLE hUSB)
- {
- return -1;
- }
- int USB_InitEpCfg(HANDLE hUSB)
- {
- return prvUSB_SetupEPFifo(hUSB);
- }
- void USB_Start(HANDLE hUSB)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- USB_OTG->INTRUSBE = 0xff;
- USB_OTG->INTRUSBE_b.en_sof = 0;
- USB_OTG->INTRTXE = 0xff;
- USB_OTG->INTRRXE = 0xfe;
- ISR_OnOff(hwUSB->IrqLine, 1);
- }
- void USB_SendZeroPacket(HANDLE hUSB, uint8_t EpIndex)
- {
- if (EpIndex)
- {
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.tx_pkt_rdy = 1;
- }
- else
- {
- USB_OTG->CSR0L_DEV_b.tx_pkt_rdy = 1;
- }
- }
- void USB_DeviceXferStop(HANDLE hUSB, uint8_t EpIndex)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- USB_OTG->INTRTXE &= ~(1 << EpIndex);
- USB_FlushFifo(hUSB, EpIndex, 0);
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.send_stall = 0;
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.sent_stall = 0;
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.under_run = 0;
- USB_OTG->INTRTXE |= (1 << EpIndex);
- }
- void USB_EpIntOnOff(HANDLE hUSB, uint8_t EpIndex, uint8_t IsToDevice, uint8_t OnOff)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- if (IsToDevice)
- {
- if (OnOff)
- {
- USB_OTG->INTRRXE |= (1 << EpIndex);
- }
- else
- {
- USB_OTG->INTRRXE &= ~(1 << EpIndex);
- }
- }
- else
- {
- if (OnOff)
- {
- USB_OTG->INTRTXE |= (1 << EpIndex);
- }
- else
- {
- USB_OTG->INTRTXE &= ~(1 << EpIndex);
- }
- }
- }
- void USB_DeviceXfer(HANDLE hUSB, uint8_t EpIndex)
- {
- USB_HWCtrlStruct *hwUSB = (USB_HWCtrlStruct *)hUSB;
- USB_EndpointCtrlStruct *pEpCtrl = &hwUSB->EpCtrl[EpIndex];
- USB_EndpointDataStruct EpData;
- uint16_t TxLen, i;
- if (pEpCtrl->TxBuf.Data)
- {
- if (pEpCtrl->TxBuf.Pos >= pEpCtrl->TxBuf.MaxLen)
- {
- if (pEpCtrl->NeedZeroPacket)
- {
- // DBG("Ep%d %d %d %d need send 0 packet", EpIndex,
- // pEpCtrl->ForceZeroPacket, pEpCtrl->TxBuf.Pos, pEpCtrl->XferMaxLen);
- if (!pEpCtrl->TxZeroPacket)
- {
- pEpCtrl->TxZeroPacket = 1;
- if (EpIndex)
- {
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.tx_pkt_rdy = 1;
- }
- else
- {
- USB_OTG->CSR0L_DEV_b.tx_pkt_rdy = 1;
- }
- }
- else
- {
- DBG("!");
- }
- }
- goto XFER_DONE;
- }
- else
- {
- pEpCtrl->TxZeroPacket = 0;
- if ((pEpCtrl->TxBuf.MaxLen - pEpCtrl->TxBuf.Pos) > pEpCtrl->MaxPacketLen)
- {
- TxLen = pEpCtrl->MaxPacketLen;
- }
- else
- {
- if (pEpCtrl->ForceZeroPacket)
- {
- pEpCtrl->NeedZeroPacket = 1;
- }
- if ((pEpCtrl->TxBuf.MaxLen - pEpCtrl->TxBuf.Pos) == pEpCtrl->MaxPacketLen)
- {
- if ( pEpCtrl->TxBuf.MaxLen < pEpCtrl->XferMaxLen )
- {
- pEpCtrl->NeedZeroPacket = 1;
- }
- }
- TxLen = pEpCtrl->TxBuf.MaxLen - pEpCtrl->TxBuf.Pos;
- }
- for(i = pEpCtrl->TxBuf.Pos; i < pEpCtrl->TxBuf.Pos + TxLen; i++)
- {
- USB_OTG->FIFOX[EpIndex].byte = pEpCtrl->TxBuf.Data[i];
- }
- pEpCtrl->TxBuf.Pos += TxLen;
- if (EpIndex)
- {
- USB_OTG->CSR[EpIndex].TXCSRL_DEV_b.tx_pkt_rdy = 1;
- }
- else
- {
- USB_OTG->CSR0L_DEV_b.tx_pkt_rdy = 1;
- }
- }
- }
- return;
- XFER_DONE:
- memset(&pEpCtrl->TxBuf, 0, sizeof(Buffer_Struct));
- if (EpIndex)
- {
- memset(&EpData, 0, sizeof(EpData));
- EpData.USB_ID = USB_ID0;
- EpData.EpIndex = EpIndex;
- pEpCtrl->CB(&EpData, pEpCtrl->pData);
- }
- else
- {
- USB_StackDeviceEp0TxDone(USB_ID0);
- }
- }
- void USB_SetDeviceNoDataSetup(HANDLE hUSB)
- {
- {
- USB_OTG->CSR0L_DEV_b.data_end = 1;
- }
- }
- void USB_FlushFifo(HANDLE hUSB, uint8_t EpIndex, uint8_t IsToDevice)
- {
- if (EpIndex)
- {
- if (IsToDevice)
- {
- USB_OTG->CSR[EpIndex].RXCSRL = (1 << 4);
- }
- else
- {
- USB_OTG->CSR[EpIndex].TXCSRL = (1 << 3);
- }
- }
- else
- {
- if (USB_OTG->CSR0L_DEV_b.rx_pkt_rdy || USB_OTG->CSR0L_DEV_b.tx_pkt_rdy)
- {
- USB_OTG->CSR0H_DEV_b.flush_fifo = 1;
- USB_OTG->CSR0L_DEV_b.serviced_rxpktrdy = 1;
- USB_OTG->CSR0L_DEV_b.tx_pkt_rdy = 0;
- }
- }
- }
- /**
- * @brief returns the EP Status
- * @param pdev : Selected device
- * ep : endpoint structure
- * @retval : EP status
- */
- uint8_t USB_GetDeviceEPStatus(HANDLE hUSB, uint8_t Index, uint8_t IsToDevice)
- {
- if (Index)
- {
- if (IsToDevice)
- {
- if (USB_OTG->CSR[Index].RXCSRL_DEV_b.sent_stall)
- {
- return USB_EP_STATE_STALL;
- }
- if (USB_OTG->CSR[Index].RXCSRL_DEV_b.data_error || USB_OTG->CSR[Index].RXCSRL_DEV_b.over_run)
- {
- return USB_EP_STATE_NAK;
- }
- return USB_EP_STATE_ACK;
- }
- else
- {
- if (USB_OTG->CSR[Index].TXCSRL_DEV_b.sent_stall)
- {
- return USB_EP_STATE_STALL;
- }
- if (USB_OTG->CSR[Index].TXCSRL_DEV_b.under_run || USB_OTG->CSR[Index].TXCSRL_DEV_b.tx_pkt_rdy)
- {
- return USB_EP_STATE_NAK;
- }
- return USB_EP_STATE_ACK;
- }
- }
- else
- {
- if (USB_OTG->CSR0L_DEV_b.sent_stall)
- {
- return USB_EP_STATE_STALL;
- }
- return USB_EP_STATE_ACK;
- }
- }
- /**
- * @brief Set the EP Status
- * @param pdev : Selected device
- * Status : new Status
- * ep : EP structure
- * @retval : None
- */
- void USB_SetDeviceEPStatus (HANDLE hUSB, uint8_t Index, uint8_t IsToDevice, uint8_t Status)
- {
- if (Index)
- {
- if (IsToDevice)
- {
- switch(Status)
- {
- case USB_EP_STATE_DISABLE:
- case USB_EP_STATE_NAK:
- case USB_EP_STATE_NYET:
- break;
- case USB_EP_STATE_STALL:
- DBG("%d", Index);
- USB_OTG->CSR[Index].RXCSRL_DEV_b.send_stall = 1;
- break;
- case USB_EP_STATE_ENABLE:
- case USB_EP_STATE_ACK:
- USB_OTG->CSR[Index].RXCSRL_DEV_b.send_stall = 0;
- USB_OTG->CSR[Index].RXCSRL_DEV_b.sent_stall = 0;
- USB_OTG->CSR[Index].RXCSRL_DEV_b.over_run = 0;
- USB_OTG->CSR[Index].RXCSRL_DEV_b.data_error = 0;
- break;
- }
- }
- else
- {
- switch(Status)
- {
- case USB_EP_STATE_DISABLE:
- case USB_EP_STATE_NAK:
- case USB_EP_STATE_NYET:
- break;
- case USB_EP_STATE_STALL:
- DBG("%d", Index);
- USB_OTG->CSR[Index].TXCSRL_DEV_b.send_stall = 1;
- break;
- case USB_EP_STATE_ENABLE:
- case USB_EP_STATE_ACK:
- USB_OTG->CSR[Index].TXCSRL_DEV_b.send_stall = 0;
- USB_OTG->CSR[Index].TXCSRL_DEV_b.sent_stall = 0;
- USB_OTG->CSR[Index].TXCSRL_DEV_b.under_run = 0;
- break;
- }
- }
- }
- else
- {
- switch(Status)
- {
- case USB_EP_STATE_DISABLE:
- case USB_EP_STATE_NYET:
- case USB_EP_STATE_NAK:
- break;
- case USB_EP_STATE_STALL:
- USB_OTG->CSR0L_DEV_b.send_stall = 1;
- break;
- case USB_EP_STATE_ACK:
- case USB_EP_STATE_ENABLE:
- USB_OTG->CSR0L_DEV_b.send_stall = 0;
- USB_OTG->CSR0L_DEV_b.sent_stall = 0;
- break;
- }
- }
- }
- void USB_ResumeStart(HANDLE hUSB)
- {
- USB_OTG->POWER_b.resume = 1;
- }
- void USB_ResumeEnd(HANDLE hUSB)
- {
- USB_OTG->POWER_b.resume = 0;
- }
- int32_t USB_SetISOCHDelay(HANDLE hUSB, uint16_t DelayNS)
- {
- return -1;
- }
- int32_t USB_ExitLatency(HANDLE hUSB, uint8_t Config[6])
- {
- return -1;
- }
- #ifdef __BUILD_APP__
- INIT_DRV_EXPORT(USB_GlobalInit, "0");
- #endif
|