BLE demo for mbed Ported RunningElectronics's SBDBT firmware for BLE. It can communicate with iOS

Dependencies:   FatFileSystem mbed

Fork of BTstack by Norimasa Okamoto

Committer:
todotani
Date:
Wed Feb 20 14:18:38 2013 +0000
Revision:
6:cf06ba884429
Parent:
0:1ed23ab1345f
Change tick timer to 1ms. Change attribute 0xFFF1 as read of DigitalIn p5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:1ed23ab1345f 1 /*
va009039 0:1ed23ab1345f 2 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
va009039 0:1ed23ab1345f 3
va009039 0:1ed23ab1345f 4 Permission is hereby granted, free of charge, to any person obtaining a copy
va009039 0:1ed23ab1345f 5 of this software and associated documentation files (the "Software"), to deal
va009039 0:1ed23ab1345f 6 in the Software without restriction, including without limitation the rights
va009039 0:1ed23ab1345f 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
va009039 0:1ed23ab1345f 8 copies of the Software, and to permit persons to whom the Software is
va009039 0:1ed23ab1345f 9 furnished to do so, subject to the following conditions:
va009039 0:1ed23ab1345f 10
va009039 0:1ed23ab1345f 11 The above copyright notice and this permission notice shall be included in
va009039 0:1ed23ab1345f 12 all copies or substantial portions of the Software.
va009039 0:1ed23ab1345f 13
va009039 0:1ed23ab1345f 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
va009039 0:1ed23ab1345f 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
va009039 0:1ed23ab1345f 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
va009039 0:1ed23ab1345f 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
va009039 0:1ed23ab1345f 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
va009039 0:1ed23ab1345f 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
va009039 0:1ed23ab1345f 20 THE SOFTWARE.
va009039 0:1ed23ab1345f 21 */
va009039 0:1ed23ab1345f 22 #include "UsbEndpoint.h"
va009039 0:1ed23ab1345f 23 #include "UsbDevice.h"
va009039 0:1ed23ab1345f 24 #include "usb_mem.h"
va009039 0:1ed23ab1345f 25
va009039 0:1ed23ab1345f 26 //#define __DEBUG
va009039 0:1ed23ab1345f 27 //#define __DEBUG3
va009039 0:1ed23ab1345f 28 //#include "dbg/dbg.h"
va009039 0:1ed23ab1345f 29 #include "mydbg.h"
va009039 0:1ed23ab1345f 30
va009039 0:1ed23ab1345f 31 void UsbEndpoint::UsbEndpoint_iso(UsbDevice* pDevice, uint8_t ep, bool dir, UsbEndpointType type, uint16_t size, int addr)
va009039 0:1ed23ab1345f 32 {
va009039 0:1ed23ab1345f 33 m_itdActive = 0;
va009039 0:1ed23ab1345f 34 m_pEd = (volatile HCED*)usb_get_ed();
va009039 0:1ed23ab1345f 35 DBG_ASSERT(m_pEd);
va009039 0:1ed23ab1345f 36 memset((void*)m_pEd, 0, sizeof(HCED));
va009039 0:1ed23ab1345f 37
va009039 0:1ed23ab1345f 38 m_pTdHead = NULL;
va009039 0:1ed23ab1345f 39 m_pTdTail = NULL;
va009039 0:1ed23ab1345f 40
va009039 0:1ed23ab1345f 41 volatile HCTD* itd = (volatile HCTD*)usb_get_itd((uint32_t)this);
va009039 0:1ed23ab1345f 42 DBG_ASSERT(itd);
va009039 0:1ed23ab1345f 43 memset((void*)itd, 0, sizeof(HCITD));
va009039 0:1ed23ab1345f 44 DBG3("m_pEd =%p\n", m_pEd);
va009039 0:1ed23ab1345f 45 DBG3("itd =%p\n", itd);
va009039 0:1ed23ab1345f 46
va009039 0:1ed23ab1345f 47 if(addr == -1)
va009039 0:1ed23ab1345f 48 addr = pDevice->m_addr;
va009039 0:1ed23ab1345f 49
va009039 0:1ed23ab1345f 50 //Setup Ed
va009039 0:1ed23ab1345f 51 //printf("\r\n--Ep Setup--\r\n");
va009039 0:1ed23ab1345f 52 m_pEd->Control = addr | /* USB address */
va009039 0:1ed23ab1345f 53 ((ep & 0x7F) << 7) | /* Endpoint address */
va009039 0:1ed23ab1345f 54 ((dir?2:1) << 11) | /* direction : Out = 1, 2 = In */
va009039 0:1ed23ab1345f 55 (1 << 15) | /* F Format */
va009039 0:1ed23ab1345f 56 (size << 16); /* MaxPkt Size */
va009039 0:1ed23ab1345f 57
va009039 0:1ed23ab1345f 58 DBG3("m_pEd->Control=%08X\n", m_pEd->Control);
va009039 0:1ed23ab1345f 59
va009039 0:1ed23ab1345f 60 m_dir = dir;
va009039 0:1ed23ab1345f 61 m_setup = false;
va009039 0:1ed23ab1345f 62 m_type = type;
va009039 0:1ed23ab1345f 63
va009039 0:1ed23ab1345f 64 m_pEd->TailTd = m_pEd->HeadTd = (uint32_t)itd; //Empty TD list
va009039 0:1ed23ab1345f 65
va009039 0:1ed23ab1345f 66 DBG("Before link\n");
va009039 0:1ed23ab1345f 67
va009039 0:1ed23ab1345f 68 //printf("\r\n--Ep Reg--\r\n");
va009039 0:1ed23ab1345f 69 //Append Ed to Ed list
va009039 0:1ed23ab1345f 70 HCCA* hcca = (HCCA*)usb_get_hcca();
va009039 0:1ed23ab1345f 71 for(int i = 0; i < 32; i++) {
va009039 0:1ed23ab1345f 72 if (hcca->IntTable[i] == 0) {
va009039 0:1ed23ab1345f 73 hcca->IntTable[i] = (uint32_t)m_pEd;
va009039 0:1ed23ab1345f 74 } else {
va009039 0:1ed23ab1345f 75 volatile HCED* nextEd = (volatile HCED*)hcca->IntTable[i];
va009039 0:1ed23ab1345f 76 while(nextEd->Next && nextEd->Next != (uint32_t)m_pEd) {
va009039 0:1ed23ab1345f 77 nextEd = (volatile HCED*)nextEd->Next;
va009039 0:1ed23ab1345f 78 }
va009039 0:1ed23ab1345f 79 nextEd->Next = (uint32_t)m_pEd;
va009039 0:1ed23ab1345f 80 }
va009039 0:1ed23ab1345f 81 }
va009039 0:1ed23ab1345f 82 }
va009039 0:1ed23ab1345f 83
va009039 0:1ed23ab1345f 84 // for isochronous
va009039 0:1ed23ab1345f 85 UsbErr UsbEndpoint::transfer(uint16_t frame, int count, volatile uint8_t* buf, int len)
va009039 0:1ed23ab1345f 86 {
va009039 0:1ed23ab1345f 87 DBG_ASSERT(count >= 1 && count <= 8);
va009039 0:1ed23ab1345f 88 DBG_ASSERT(buf);
va009039 0:1ed23ab1345f 89 DBG_ASSERT((len % count) == 0);
va009039 0:1ed23ab1345f 90 HCITD *itd = (HCITD*)m_pEd->TailTd;
va009039 0:1ed23ab1345f 91 DBG_ASSERT(itd);
va009039 0:1ed23ab1345f 92 HCITD *new_itd = (HCITD*)usb_get_itd((uint32_t)this);
va009039 0:1ed23ab1345f 93 DBG_ASSERT(new_itd);
va009039 0:1ed23ab1345f 94 if (itd == NULL) {
va009039 0:1ed23ab1345f 95 return USBERR_ERROR;
va009039 0:1ed23ab1345f 96 }
va009039 0:1ed23ab1345f 97 DBG("itd=%p\n", itd);
va009039 0:1ed23ab1345f 98 DBG2("new_itd=%p\n", new_itd);
va009039 0:1ed23ab1345f 99 int di = 0; //DelayInterrupt
va009039 0:1ed23ab1345f 100 itd->Control = 0xe0000000 | // CC ConditionCode NOT ACCESSED
va009039 0:1ed23ab1345f 101 ((count-1) << 24) | // FC FrameCount
va009039 0:1ed23ab1345f 102 TD_DELAY_INT(di) | // DI DelayInterrupt
va009039 0:1ed23ab1345f 103 frame; // SF StartingFrame
va009039 0:1ed23ab1345f 104 itd->BufferPage0 = (uint32_t)buf;
va009039 0:1ed23ab1345f 105 itd->BufferEnd = (uint32_t)buf+len-1;
va009039 0:1ed23ab1345f 106 itd->Next = (uint32_t)new_itd;
va009039 0:1ed23ab1345f 107 uint16_t offset[8];
va009039 0:1ed23ab1345f 108 for(int i = 0; i < 8; i++) {
va009039 0:1ed23ab1345f 109 uint32_t addr = (uint32_t)buf + i*(len/count);
va009039 0:1ed23ab1345f 110 offset[i] = addr & 0x0fff;
va009039 0:1ed23ab1345f 111 if ((addr&0xfffff000) == (itd->BufferEnd&0xfffff000)) {
va009039 0:1ed23ab1345f 112 offset[i] |= 0x1000;
va009039 0:1ed23ab1345f 113 }
va009039 0:1ed23ab1345f 114 offset[i] |= 0xe000;
va009039 0:1ed23ab1345f 115 }
va009039 0:1ed23ab1345f 116 itd->OffsetPSW10 = (offset[1]<<16) | offset[0];
va009039 0:1ed23ab1345f 117 itd->OffsetPSW32 = (offset[3]<<16) | offset[2];
va009039 0:1ed23ab1345f 118 itd->OffsetPSW54 = (offset[5]<<16) | offset[4];
va009039 0:1ed23ab1345f 119 itd->OffsetPSW76 = (offset[7]<<16) | offset[6];
va009039 0:1ed23ab1345f 120 m_itdActive++;
va009039 0:1ed23ab1345f 121 DBG2("itd->Control =%08X\n", itd->Control);
va009039 0:1ed23ab1345f 122 DBG2("itd->BufferPage0=%08X\n", itd->BufferPage0);
va009039 0:1ed23ab1345f 123 DBG2("itd->Next =%08X\n", itd->Next);
va009039 0:1ed23ab1345f 124 DBG2("itd->BufferEnd =%08X\n", itd->BufferEnd);
va009039 0:1ed23ab1345f 125 DBG2("itd->OffsetPSW10=%08X\n", itd->OffsetPSW10);
va009039 0:1ed23ab1345f 126 DBG2("itd->OffsetPSW32=%08X\n", itd->OffsetPSW32);
va009039 0:1ed23ab1345f 127 DBG2("itd->OffsetPSW54=%08X\n", itd->OffsetPSW54);
va009039 0:1ed23ab1345f 128 DBG2("itd->OffsetPSW76=%08X\n", itd->OffsetPSW76);
va009039 0:1ed23ab1345f 129 m_pEd->TailTd = (uint32_t)new_itd; // start!!!
va009039 0:1ed23ab1345f 130 LPC_USB->HcControl |= OR_CONTROL_PLE; //Enable Periodic
va009039 0:1ed23ab1345f 131 return USBERR_PROCESSING;
va009039 0:1ed23ab1345f 132 }