xref: /btstack/chipset/stlc2500d/btstack_chipset_stlc2500d.c (revision faa6c1f625806f77d213afda856e452e3e27fee8)
1*faa6c1f6SMatthias Ringwald /*
2*faa6c1f6SMatthias Ringwald  * Copyright (C) 2014 BlueKitchen GmbH
3*faa6c1f6SMatthias Ringwald  *
4*faa6c1f6SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5*faa6c1f6SMatthias Ringwald  * modification, are permitted provided that the following conditions
6*faa6c1f6SMatthias Ringwald  * are met:
7*faa6c1f6SMatthias Ringwald  *
8*faa6c1f6SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9*faa6c1f6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10*faa6c1f6SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*faa6c1f6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*faa6c1f6SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13*faa6c1f6SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*faa6c1f6SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15*faa6c1f6SMatthias Ringwald  *    from this software without specific prior written permission.
16*faa6c1f6SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*faa6c1f6SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18*faa6c1f6SMatthias Ringwald  *    monetary gain.
19*faa6c1f6SMatthias Ringwald  *
20*faa6c1f6SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*faa6c1f6SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*faa6c1f6SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*faa6c1f6SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24*faa6c1f6SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*faa6c1f6SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*faa6c1f6SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*faa6c1f6SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*faa6c1f6SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*faa6c1f6SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*faa6c1f6SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*faa6c1f6SMatthias Ringwald  * SUCH DAMAGE.
32*faa6c1f6SMatthias Ringwald  *
33*faa6c1f6SMatthias Ringwald  * Please inquire about commercial licensing options at
34*faa6c1f6SMatthias Ringwald  * [email protected]
35*faa6c1f6SMatthias Ringwald  *
36*faa6c1f6SMatthias Ringwald  */
37*faa6c1f6SMatthias Ringwald 
38*faa6c1f6SMatthias Ringwald /*
39*faa6c1f6SMatthias Ringwald  *  bt_control_stlc2500d.c
40*faa6c1f6SMatthias Ringwald  *
41*faa6c1f6SMatthias Ringwald  *  Adapter to use stlc2500d-based chipsets with BTstack
42*faa6c1f6SMatthias Ringwald  *
43*faa6c1f6SMatthias Ringwald  */
44*faa6c1f6SMatthias Ringwald 
45*faa6c1f6SMatthias Ringwald #include "btstack_config.h"
46*faa6c1f6SMatthias Ringwald #include "bt_control_stlc2500d.h"
47*faa6c1f6SMatthias Ringwald 
48*faa6c1f6SMatthias Ringwald #include <stddef.h>   /* NULL */
49*faa6c1f6SMatthias Ringwald #include <stdio.h>
50*faa6c1f6SMatthias Ringwald #include <string.h>   /* memcpy */
51*faa6c1f6SMatthias Ringwald #include "hci.h"
52*faa6c1f6SMatthias Ringwald #include "btstack_debug.h"
53*faa6c1f6SMatthias Ringwald 
54*faa6c1f6SMatthias Ringwald // should go to some common place
55*faa6c1f6SMatthias Ringwald #define OPCODE(ogf, ocf) (ocf | ogf << 10)
56*faa6c1f6SMatthias Ringwald 
57*faa6c1f6SMatthias Ringwald static void chipset_set_baudrate_command(uint32_t baudrate, uint8_t *hci_cmd_buffer){
58*faa6c1f6SMatthias Ringwald     // map baud rate to predefined settings
59*faa6c1f6SMatthias Ringwald     int preset = 0;
60*faa6c1f6SMatthias Ringwald     switch (baudrate){
61*faa6c1f6SMatthias Ringwald         case 57600:
62*faa6c1f6SMatthias Ringwald             preset = 0x0e;
63*faa6c1f6SMatthias Ringwald             break;
64*faa6c1f6SMatthias Ringwald         case 115200:
65*faa6c1f6SMatthias Ringwald             preset = 0x10;
66*faa6c1f6SMatthias Ringwald             break;
67*faa6c1f6SMatthias Ringwald         case 230400:
68*faa6c1f6SMatthias Ringwald             preset = 0x12;
69*faa6c1f6SMatthias Ringwald             break;
70*faa6c1f6SMatthias Ringwald         case 460800:
71*faa6c1f6SMatthias Ringwald             preset = 0x13;
72*faa6c1f6SMatthias Ringwald             break;
73*faa6c1f6SMatthias Ringwald         case 921600:
74*faa6c1f6SMatthias Ringwald             preset = 0x14;
75*faa6c1f6SMatthias Ringwald             break;
76*faa6c1f6SMatthias Ringwald         case 1843200:
77*faa6c1f6SMatthias Ringwald             preset = 0x16;
78*faa6c1f6SMatthias Ringwald             break;
79*faa6c1f6SMatthias Ringwald         case 2000000:
80*faa6c1f6SMatthias Ringwald             preset = 0x19;
81*faa6c1f6SMatthias Ringwald             break;
82*faa6c1f6SMatthias Ringwald         case 3000000:
83*faa6c1f6SMatthias Ringwald             preset = 0x1b;
84*faa6c1f6SMatthias Ringwald             break;
85*faa6c1f6SMatthias Ringwald         case 4000000:
86*faa6c1f6SMatthias Ringwald             preset = 0x1f;
87*faa6c1f6SMatthias Ringwald             break;
88*faa6c1f6SMatthias Ringwald         default:
89*faa6c1f6SMatthias Ringwald             log_error("stlc2500d_baudrate_cmd baudrate %u not supported", baudrate);
90*faa6c1f6SMatthias Ringwald             return;
91*faa6c1f6SMatthias Ringwald     }
92*faa6c1f6SMatthias Ringwald     bt_store_16(hci_cmd_buffer, 0, OPCODE(OGF_VENDOR, 0xfc));
93*faa6c1f6SMatthias Ringwald     hci_cmd_buffer[2] = 0x01;
94*faa6c1f6SMatthias Ringwald     hci_cmd_buffer[3] = preset;
95*faa6c1f6SMatthias Ringwald }
96*faa6c1f6SMatthias Ringwald 
97*faa6c1f6SMatthias Ringwald static void chipset_set_bd_addr_command(bd_addr_t addr, uint8_t *hci_cmd_buffer){
98*faa6c1f6SMatthias Ringwald     bt_store_16(hci_cmd_buffer, 0, OPCODE(OGF_VENDOR, 0x22));
99*faa6c1f6SMatthias Ringwald     hci_cmd_buffer[2] = 0x08;
100*faa6c1f6SMatthias Ringwald     hci_cmd_buffer[3] = 254;
101*faa6c1f6SMatthias Ringwald     hci_cmd_buffer[4] = 0x06;
102*faa6c1f6SMatthias Ringwald     bt_flip_addr(&hci_cmd_buffer[5], addr);
103*faa6c1f6SMatthias Ringwald }
104*faa6c1f6SMatthias Ringwald 
105*faa6c1f6SMatthias Ringwald static const btstack_chipset_t btstack_chipset_bcm = {
106*faa6c1f6SMatthias Ringwald     "BCM",
107*faa6c1f6SMatthias Ringwald     NULL, // chipset_init,
108*faa6c1f6SMatthias Ringwald     NULL, // chipset_next_command,
109*faa6c1f6SMatthias Ringwald     chipset_set_baudrate_command,
110*faa6c1f6SMatthias Ringwald     chipset_set_bd_addr_command,
111*faa6c1f6SMatthias Ringwald };
112*faa6c1f6SMatthias Ringwald 
113*faa6c1f6SMatthias Ringwald // MARK: public API
114*faa6c1f6SMatthias Ringwald const btstack_chipset_t * btstack_chipset_bcm_instance(void){
115*faa6c1f6SMatthias Ringwald     return &btstack_chipset_bcm;
116*faa6c1f6SMatthias Ringwald }
117