diff --git a/firmware/broadcom_patchram.ksy b/firmware/broadcom_patchram.ksy new file mode 100644 index 000000000..b21812519 --- /dev/null +++ b/firmware/broadcom_patchram.ksy @@ -0,0 +1,99 @@ +meta: + id: broadcom_patchram + title: Broadcom patchram blob + license: MIT + endian: le +doc: | + Patches for Broadcom chips firmware in ROM. + This spec describes the format of the blobs that are sent to the chip, that encode. + The blobs are uploded into chip RAM using WRITE_RAM to a special offsets in chip RAM in DOWNLOAD_MINIDRIVER mode, then when the chip is launched using LAUNCH_RAM. + The hcd files contain raw HCI commands to be sent to chips, the offsets are already there. They should be parsed with another spec, hardware/bluetooth/bluetooth_hcd, the commands should be emulated and this spec should be applied to the result. +doc-ref: + - https://raw.githubusercontent.com/seemoo-lab/internalblue/master/doc/internalblue_thesis_dennis_mantz.pdf + - https://github.com/MarkMendelsohn/brcm_patchram/blob/master/brcm_patchram_plus.c#L634 +seq: + - id: patches + type: patch + repeat: until + repeat-until: "_.command == command::end_fe or _.command == command::end_ef" +types: + patch: + seq: + - id: command + type: u1 + enum: command + - id: size + type: u2 + - id: value + size: size + type: + switch-on: command + cases: + 'command::patch_memory': patch_memory + 'command::patch_dword': patch_dword + 'command::reboot': reboot + types: + reboot: + seq: + - id: next_tlv_record_addr + type: u4 + doc: "When the TLV parser in the Download_Minidriver state processes the type 0x02 it initiates a reboot. However, in an early state of the boot process parsing the TLV list is continued at the address specified in the value of the TLV. In case of the bcm4335c5.hcd this is actually just the address of the next TLV object in the list." + - id: unkn0 + size: 6 + doc: Zero bytes? + patch_memory: + seq: + - id: target + type: u4 + - id: data + size-eos: true + patch_dword: + doc: | + Patching procedure (page 28 of the PDF, have I got it right?): + auto value_table = (uint32_t *)0xD0000; // ram + auto addr_table = (uint32_t *)0x310000; // hw register + value_table[rec.slot()] = rec.new_value(); + addr_table[rec.slot()] = rec.target(); + seq: + - id: slot + type: u1 + - id: target + -orig-id: target_address + type: u4 + - id: new_value + type: u4 + - id: unkn0 + type: u2 + doc: 0x0000 + - id: unkn1 + type: u4 +enums: + command: + 0x02: + id: reboot + doc: | + Issue a reboot and continues processing the list after the reset. + In the analyzed firmware patch (bcm4335c5.hcd) this typeis used exactly once and relatively early in the list before any of the type 0x08 objects. + 0x08: + id: patch_dword + doc: | + Patch 32-bit word in ROM. + 0x0a: + id: patch_memory + doc: Patch arbitray length of bytes in RAM. + + 0x40: + id: set_mac_addr + doc: Set default Bluetooth Device Address. + + 0x41: + id: set_local_device_name + doc: An ASCII string which is set to bethe new local device name. + + 0xfe: + id: end_fe + + 0xef: + id: end_ef + + # todo: 0x03,0x0b,0x1a,0x40,0x68,0x69,0x6f,0x70,0x82,0x86,0x90,0xb1,0xb2,0xb3,0xc0,0xc1,0xd8,0xfd diff --git a/hardware/bluetooth/.gitignore b/hardware/bluetooth/.gitignore new file mode 100644 index 000000000..e7db04e20 --- /dev/null +++ b/hardware/bluetooth/.gitignore @@ -0,0 +1 @@ +/company-identifiers.html diff --git a/hardware/bluetooth/bluetooth_hcd.ksy b/hardware/bluetooth/bluetooth_hcd.ksy new file mode 100644 index 000000000..1af9a6a1f --- /dev/null +++ b/hardware/bluetooth/bluetooth_hcd.ksy @@ -0,0 +1,27 @@ +meta: + id: bluetooth_hcd + title: Bluetooth Host Controller Interface Control Protocol + license: Unlicense + file-extension: hcd + endian: le + imports: + - control/bluetooth_control_command + - bluetooth_vendors_ids + xref: + wikidata: Q39531 + ieee: 802.15.1 +doc: | + Bluetooth Host Controller Interface protocol. +doc-ref: + - https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=478726 + - https://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_sdk/1.60.00.29_new/exports/docs/ble5stack/vendor_specific_guide/BLE_Vendor_Specific_HCI_Guide/hci_interface.html + - https://www.ti.com/lit/ug/swru442b/swru442b.pdf?ts=1594902336269 + - https://community.nxp.com/docs/DOC-341764 +params: + - id: vendor + type: u2 + enum: bluetooth_vendors_ids::vendor +seq: + - id: commands + type: bluetooth_control_command(vendor) + repeat: eos diff --git a/hardware/bluetooth/bluetooth_vendors_ids.ksy b/hardware/bluetooth/bluetooth_vendors_ids.ksy new file mode 100644 index 000000000..eef3dc073 --- /dev/null +++ b/hardware/bluetooth/bluetooth_vendors_ids.ksy @@ -0,0 +1,2555 @@ +meta: + id: bluetooth_vendors_ids + title: Bluetooth Company identifiers + endian: le +doc: A large enum with Company identifiers assigned by the Bluetooth SIG +doc-ref: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers/ +enums: + vendor: + 0x0: ericsson_technology_licensing + 0x1: nokia_mobile_phones + 0x2: intel + 0x3: ibm + 0x4: toshiba + 0x5: zero_point_zero_one_three_com + 0x6: microsoft + 0x7: lucent + 0x8: motorola + 0x9: infineon_technologies + 0xa: qualcomm_technologies_international_ltd_qtil + 0xb: silicon_wave + 0xc: digianswer + 0xd: texas_instruments + 0xe: parthus_technologies + 0xf: broadcom + 0x10: mitel_semiconductor + 0x11: widcomm + 0x12: zeevo + 0x13: atmel + 0x14: mitsubishi_electric + 0x15: rtx_telecom + 0x16: kc_technology + 0x17: newlogic + 0x18: transilica + 0x19: rohde_schwarz + 0x1a: ttp_com + 0x1b: signia_technologies + 0x1c: conexant_systems + 0x1d: qualcomm + 0x1e: inventel + 0x1f: avm_berlin + 0x20: band_speed + 0x21: mansella + 0x22: nec + 0x23: wave_plus_technology + 0x24: alcatel + 0x25: nxp_semiconductors + 0x26: c_technologies + 0x27: open_interface + 0x28: r_f_micro_devices + 0x29: hitachi + 0x2a: symbol_technologies + 0x2b: tenovis + 0x2c: macronix_international + 0x2d: gct_semiconductor + 0x2e: norwood_systems + 0x2f: mew_tel_technology + 0x30: st_microelectronics + 0x31: synopsys + 0x32: red_m_communications + 0x33: commil + 0x34: computer_access_technology_corporation_catc + 0x35: eclipse_hq_espana + 0x36: renesas_electronics + 0x37: mobilian + 0x38: syntronix + 0x39: integrated_system_solution + 0x3a: panasonic + 0x3b: gennum + 0x3c: black_berry + 0x3d: i_pextreme + 0x3e: systems_and_chips + 0x3f: bluetooth_sig + 0x40: seiko_epson + 0x41: integrated_silicon_solution_taiwan + 0x42: conwise_technology + 0x43: parrot_automotive + 0x44: socket_mobile + 0x45: atheros_communications + 0x46: media_tek + 0x47: bluegiga + 0x48: marvell_technology + 0x49: zero_point_zero_one_three_dsp + 0x4a: accel_semiconductor + 0x4b: continental_automotive_systems + 0x4c: apple + 0x4d: staccato_communications + 0x4e: avago_technologies + 0x4f: apt + 0x50: si_rf_technology + 0x51: tzero_technologies + 0x52: j_m + 0x53: free2move + 0x54: zero_point_zero_one_three_di_joy + 0x55: plantronics + 0x56: sony_ericsson_mobile_communications + 0x57: harman_international_industries + 0x58: vizio + 0x59: nordic_semiconductor + 0x5a: em_microelectronic_marin + 0x5b: ralink_technology + 0x5c: belkin_international + 0x5d: realtek_semiconductor + 0x5e: stonestreet_one + 0x5f: wicentric + 0x60: riviera_waves + 0x61: rda_microelectronics + 0x62: gibson_guitars + 0x63: mi_command + 0x64: band_xi_international + 0x65: hewlett_packard + 0x66: zero_point_zero_one_nine_solutions + 0x67: gn_netcom + 0x68: general_motors + 0x69: a_d_engineering + 0x6a: mind_tree + 0x6b: polar_electro + 0x6c: beautiful_enterprise + 0x6d: briar_tek + 0x6e: summit_data_communications + 0x6f: sound_id + 0x70: monster + 0x71: connect_blue + 0x72: shang_hai_super_smart_electronics + 0x73: group_sense + 0x74: zomm + 0x75: samsung_electronics + 0x76: creative_technology + 0x77: laird_technologies + 0x78: nike + 0x79: lesswire + 0x7a: m_star_semiconductor + 0x7b: hanlynn_technologies + 0x7c: a_r_cambridge + 0x7d: seers_technology + 0x7e: sports_tracking_technologies + 0x7f: autonet_mobile + 0x80: de_lorme_publishing + 0x81: wu_xi_vimicro + 0x82: sennheiser_communications + 0x83: time_keeping_systems + 0x84: ludus_helsinki + 0x85: blue_radios + 0x86: equinux + 0x87: garmin_international + 0x88: ecotest + 0x89: gn_re_sound + 0x8a: jawbone + 0x8b: topcon_positioning_systems + 0x8c: gimbal + 0x8d: zscan_software + 0x8e: quintic + 0x8f: telit_wireless_solutions + 0x90: funai_electric + 0x91: advanced_panmobil_systems + 0x92: think_optics + 0x93: universal_electronics + 0x94: airoha_technology + 0x95: nec_lighting + 0x96: odm_technology + 0x97: connecte_device + 0x98: zero1_tv + 0x99: i_tech_dynamic_global_distribution + 0x9a: alpwise + 0x9b: jiangsu_toppower_automotive_electronics + 0x9c: colorfy + 0x9d: geoforce + 0x9e: bose + 0x9f: suunto + 0xa0: kensington_computer_products + 0xa1: sr_medizinelektronik + 0xa2: vertu + 0xa3: meta_watch + 0xa4: linak + 0xa5: otl_dynamics + 0xa6: panda_ocean + 0xa7: visteon + 0xa8: arp_devices + 0xa9: marelli_europe + 0xaa: caen_rfid + 0xab: ingenieur_systemgruppe_zahn + 0xac: green_throttle_games + 0xad: peter_systemtechnik + 0xae: omegawave + 0xaf: cinetix + 0xb0: passif_semiconductor + 0xb1: saris_cycling + 0xb2: bekey + 0xb3: clarinox_technologies + 0xb4: bde_technology + 0xb5: swirl_networks + 0xb6: meso_international + 0xb7: tre_lab + 0xb8: qualcomm_innovation_center_inc_qu_ic + 0xb9: johnson_controls + 0xba: starkey_laboratories + 0xbb: s_power_electronics + 0xbc: ace_sensor + 0xbd: aplix + 0xbe: aamp_of_america + 0xbf: stalmart_technology + 0xc0: amiccom_electronics + 0xc1: shenzhen_excelsecu_data_technology + 0xc2: geneq + 0xc3: adidas + 0xc4: lg_electronics + 0xc5: onset_computer + 0xc6: selfly + 0xc7: quuppa + 0xc8: ge_lo + 0xc9: evluma + 0xca: mc10 + 0xcb: binauric + 0xcc: beats_electronics + 0xcd: microchip_technology + 0xce: elgato_systems + 0xcf: archos + 0xd0: dexcom + 0xd1: polar_electro_europe + 0xd2: dialog_semiconductor + 0xd3: taixingbang_technology_hk + 0xd4: kawantech + 0xd5: austco_communication_systems + 0xd6: timex_group_usa + 0xd7: qualcomm_technologies + 0xd8: qualcomm_connected_experiences + 0xd9: voyetra_turtle_beach + 0xda: txtr + 0xdb: biosentronics + 0xdc: procter_gamble + 0xdd: hosiden + 0xde: muzik + 0xdf: misfit_wearables + 0xe0: google + 0xe1: danlers + 0xe2: semilink + 0xe3: in_music_brands + 0xe4: laird_connectivity + 0xe5: eden_software_consultants + 0xe6: freshtemp + 0xe7: ks_technologies + 0xe8: acts_technologies + 0xe9: vtrack_systems + 0xea: nielsen_kellerman + 0xeb: server_technology + 0xec: bio_research_associates + 0xed: jolly_logic + 0xee: above_average_outcomes + 0xef: bitsplitters + 0xf0: pay_pal + 0xf1: witron_technology + 0xf2: morse_project + 0xf3: kent_displays + 0xf4: nautilus + 0xf5: smartifier + 0xf6: elcometer + 0xf7: vsn_technologies + 0xf8: ace_uni + 0xf9: stick_n_find + 0xfa: crystal_code + 0xfb: koukaam + 0xfc: delphi + 0xfd: valence_tech + 0xfe: stanley_black_and_decker + 0xff: typo_products + 0x100: tom_tom_international + 0x101: fugoo + 0x102: keiser + 0x103: bang_olufsen + 0x104: plus_location_systems + 0x105: ubiquitous_computing_technology + 0x106: innovative_yachtter_solutions + 0x107: william_demant_holding + 0x108: chicony_electronics + 0x109: atus + 0x10a: codegate + 0x10b: e_ri + 0x10c: transducers_direct + 0x10d: denso_ten + 0x10e: audi + 0x10f: hi_silicon_technologies + 0x110: nippon_seiki + 0x111: steelseries + 0x112: visybl + 0x113: openbrain_technologies + 0x114: xensr + 0x115: e_solutions + 0x116: zero_point_zero_two_one_zero_ak_technologies + 0x117: wimoto_technologies + 0x118: radius_networks + 0x119: wize_technology + 0x11a: qualcomm_labs + 0x11b: hewlett_packard_enterprise + 0x11c: baidu + 0x11d: arendi + 0x11e: skoda_auto + 0x11f: volkswagen + 0x120: porsche + 0x121: sino_wealth_electronic + 0x122: air_turn + 0x123: kinsa + 0x124: hid_global + 0x125: seat_es + 0x126: promethean + 0x127: salutica_allied_solutions + 0x128: gpsi + 0x129: nimble_devices + 0x12a: changzhou_yongse_infotech + 0x12b: sport_iq + 0x12c: temec_instruments + 0x12d: sony + 0x12e: assa_abloy + 0x12f: clarion + 0x130: warehouse_innovations + 0x131: cypress_semiconductor + 0x132: mads + 0x133: blue_maestro + 0x134: resolution_products + 0x135: aireware + 0x136: silvair + 0x137: prestigio_plaza + 0x138: nteo + 0x139: focus_systems + 0x13a: tencent_holdings + 0x13b: allegion + 0x13c: murata_manufacturing + 0x13d: wireless_werx + 0x13e: nod + 0x13f: b_b_manufacturing + 0x140: alpine_electronics_china + 0x141: fed_ex_services + 0x142: grape_systems + 0x143: bkon_connect + 0x144: lintech + 0x145: novatel_wireless + 0x146: ciright + 0x147: mighty_cast + 0x148: ambimat_electronics + 0x149: perytons + 0x14a: tivoli_audio + 0x14b: master_lock + 0x14c: mesh_net + 0x14d: huizhou_desay_sv_automotive + 0x14e: tangerine + 0x14f: b_w + 0x150: pioneer + 0x151: on_beep + 0x152: vernier_software_technology + 0x153: rol_ergo + 0x154: pebble_technology + 0x155: netatmo + 0x156: accumulate + 0x157: anhui_huami_information_technology + 0x158: inmite + 0x159: chef_steps + 0x15a: micas + 0x15b: biomedical_research + 0x15c: pitius_tec + 0x15d: estimote + 0x15e: unikey_technologies + 0x15f: timer_cap + 0x160: awo_x + 0x161: yikes + 0x162: mads_global_nz + 0x163: pch_international + 0x164: qingdao_yeelink_information_technology + 0x165: milwaukee_tool_formally_milwaukee_electric_tools + 0x166: mishik + 0x167: ascensia_diabetes_care_us + 0x168: spicebox + 0x169: emberlight + 0x16a: cooper_atkins + 0x16b: qblinks + 0x16c: mysphera + 0x16d: life_scan + 0x16e: volantic + 0x16f: podo_labs + 0x170: roche_diabetes_care + 0x171: amazon_com_services + 0x172: connovate_technology + 0x173: kocomojo + 0x174: everykey + 0x175: dynamic_controls + 0x176: sentri_lock + 0x177: i_syst + 0x178: casio_computer + 0x179: lapis_technology + 0x17a: telemonitor + 0x17b: taskit + 0x17c: daimler + 0x17d: bat_and_cat + 0x17e: blu_dotz + 0x17f: x_tel_wireless + 0x180: gigaset_communications + 0x181: gecko_health_innovations + 0x182: hop_ubiquitous + 0x183: walt_disney + 0x184: nectar + 0x185: bel_apps + 0x186: core_lighting + 0x187: seraphim_sense + 0x188: unico_rbc + 0x189: physical_enterprises + 0x18a: able_trend_technology + 0x18b: konica_minolta + 0x18c: wilo + 0x18d: extron_design_services + 0x18e: fitbit + 0x18f: fireflies_systems + 0x190: intelletto_technologies + 0x191: fdk + 0x192: cloudleaf + 0x193: maveric_automation + 0x194: acoustic_stream + 0x195: zuli + 0x196: paxton_access + 0x197: wi_silica + 0x198: vengit_korlatolt_felelossegu_tarsasag + 0x199: salto_systems + 0x19a: tron_forum + 0x19b: cubetech + 0x19c: cokiya + 0x19d: cvs_health + 0x19e: ceruus + 0x19f: strainstall + 0x1a0: channel_enterprises_hk + 0x1a1: fiamm + 0x1a2: gigalane + 0x1a3: eroad + 0x1a4: mine_safety_appliances + 0x1a5: icon_health_and_fitness + 0x1a6: wille_engineering_formely_as_asandoo + 0x1a7: energous + 0x1a8: taobao + 0x1a9: canon + 0x1aa: geophysical_technology + 0x1ab: facebook + 0x1ac: trividia_health + 0x1ad: flight_safety_international + 0x1ae: earlens + 0x1af: sunrise_micro_devices + 0x1b0: star_micronics + 0x1b1: netizens + 0x1b2: nymi + 0x1b3: nytec + 0x1b4: trineo + 0x1b5: nest_labs + 0x1b6: lm_technologies + 0x1b7: general_electric + 0x1b8: i_d3 + 0x1b9: hana_micron + 0x1ba: stages_cycling + 0x1bb: cochlear_bone_anchored_solutions + 0x1bc: senion_lab + 0x1bd: syszone + 0x1be: pulsate_mobile + 0x1bf: hong_kong_hunter_sun_electronic + 0x1c0: pironex + 0x1c1: bradatech + 0x1c2: transenergooil + 0x1c3: bunch + 0x1c4: dme_microelectronics + 0x1c5: bitcraze + 0x1c6: hasware + 0x1c7: abiogenix + 0x1c8: poly_control + 0x1c9: avi_on + 0x1ca: laerdal_medical + 0x1cb: fetch_my_pet + 0x1cc: sam_labs + 0x1cd: chengdu_synwing_technology + 0x1ce: houwa_system_design_k_k + 0x1cf: bsh + 0x1d0: primus_inter_pares + 0x1d1: august_home + 0x1d2: gill_electronics + 0x1d3: sky_wave_design + 0x1d4: newlab + 0x1d5: elad + 0x1d6: g_wearables + 0x1d7: squadrone_systems + 0x1d8: code + 0x1d9: savant_systems + 0x1da: logitech_international + 0x1db: innblue_consulting + 0x1dc: i_parking + 0x1dd: koninklijke_philips_electronics + 0x1de: minelab_electronics + 0x1df: bison + 0x1e0: widex + 0x1e1: jolla + 0x1e2: lectronix + 0x1e3: caterpillar + 0x1e4: freedom_innovations + 0x1e5: dynamic_devices + 0x1e6: technology_solutions_uk + 0x1e7: ips + 0x1e8: stir + 0x1e9: sano + 0x1ea: advanced_application_design + 0x1eb: auto_map + 0x1ec: spreadtrum_communications_shanghai + 0x1ed: cute_circuit + 0x1ee: valeo_service + 0x1ef: fullpower_technologies + 0x1f0: kloud_nation + 0x1f1: zebra_technologies + 0x1f2: itron + 0x1f3: the_university_of_tokyo + 0x1f4: utc_fire_and_security + 0x1f5: cool_webthings + 0x1f6: djo_global + 0x1f7: gelliner + 0x1f8: anyka_guangzhou_microelectronics_technology + 0x1f9: medtronic + 0x1fa: gozio + 0x1fb: form_lifting + 0x1fc: wahoo_fitness + 0x1fd: kontakt_micro_location + 0x1fe: radio_systems + 0x1ff: freescale_semiconductor + 0x200: verifone_systems_pte_ltd_taiwan_branch + 0x201: ar_timing + 0x202: rigado + 0x203: kemppi + 0x204: tapcentive + 0x205: smartbotics + 0x206: otter_products + 0x207: stemp + 0x208: lumi_geek + 0x209: invision_heart + 0x20a: macnica + 0x20b: jaguar_land_rover + 0x20c: coro_ware_technologies + 0x20d: simplo_technology + 0x20e: omron_healthcare + 0x20f: comodule + 0x210: ike_gps + 0x211: telink_semiconductor + 0x212: interplan + 0x213: wyler + 0x214: ik_multimedia_production + 0x215: lukoton_experience + 0x216: mti + 0x217: tech4home + 0x218: hiotech + 0x219: dott + 0x21a: blue_speck_labs + 0x21b: cisco_systems + 0x21c: mobicomm + 0x21d: edamic + 0x21e: goodnet + 0x21f: luster_leaf_products + 0x220: manus_machina + 0x221: mobiquity_networks + 0x222: praxis_dynamics + 0x223: philip_morris_products + 0x224: comarch + 0x225: nestle_nespresso + 0x226: merlinia + 0x227: life_beam_technologies + 0x228: twocanoes_labs + 0x229: muoverti + 0x22a: stamer_musikanlagen + 0x22b: tesla_motors + 0x22c: pharynks + 0x22d: lupine + 0x22e: siemens + 0x22f: huami_shanghai_culture_communication + 0x230: foster_electric + 0x231: eta + 0x232: x_senso_solutions + 0x233: shenzhen_su_long_communication + 0x234: feng_fan_bei_jing_technology + 0x235: qrio + 0x236: pitpatpet + 0x237: ms_heli + 0x238: trakm8 + 0x239: jin + 0x23a: alatech_tehnology + 0x23b: beijing_care_pulse_electronic_technology + 0x23c: awarepoint + 0x23d: vi_centra + 0x23e: raven_industries + 0x23f: wave_ware_technologies + 0x240: argenox_technologies + 0x241: bragi + 0x242: zero_point_zero_two_one_six_lab + 0x243: masimo + 0x244: iotera + 0x245: endress_hauser + 0x246: ac_kme_networks + 0x247: fifty_three + 0x248: parker_hannifin + 0x249: transcranial + 0x24a: uwatec + 0x24b: orlan + 0x24c: blue_clover_devices + 0x24d: m_way_solutions + 0x24e: microtronics_engineering + 0x24f: schneider_schreibgerate + 0x250: sapphire_circuits + 0x251: lumo_bodytech + 0x252: ukc_technosolution + 0x253: xicato + 0x254: playbrush + 0x255: dai_nippon_printing + 0x256: g24_power + 0x257: ad_babble_local_commerce + 0x258: devialet + 0x259: altyor + 0x25a: university_of_applied_sciences_valais_haute_ecole_valaisanne + 0x25b: five_interactive_llc_dba_zendo + 0x25c: net_ease_hangzhou_network + 0x25d: lexmark_international + 0x25e: fluke + 0x25f: yardarm_technologies + 0x260: sensa_rx + 0x261: secvre + 0x262: glacial_ridge_technologies + 0x263: identiv + 0x264: dds + 0x265: smk + 0x266: schawbel_technologies + 0x267: xmi_systems + 0x268: cerevo + 0x269: torrox + 0x26a: gemalto + 0x26b: deka_research_development + 0x26c: domster_tadeusz_szydlowski + 0x26d: technogym + 0x26e: fleurbaey + 0x26f: aptcode_solutions + 0x270: lsi_adl_technology + 0x271: animas + 0x272: alps_electric + 0x273: oceasoft + 0x274: motsai_research + 0x275: geotab + 0x276: e_g_o_elektro_geraetebau + 0x277: bewhere + 0x278: johnson_outdoors + 0x279: steute_schaltgerate + 0x27a: ekomini + 0x27b: defa + 0x27c: aseptika + 0x27d: huawei_technologies + 0x27e: habit_aware + 0x27f: ruwido_austria + 0x280: itec + 0x281: stone_l + 0x282: sonova + 0x283: maven_machines + 0x284: synapse_electronics + 0x285: standard_innovation + 0x286: rf_code + 0x287: wally_ventures + 0x288: willowbank_electronics + 0x289: sk_telecom + 0x28a: jetro + 0x28b: code_gears + 0x28c: nanolink + 0x28d: if_ + 0x28e: rf_digital + 0x28f: church_dwight + 0x290: multibit + 0x291: clini_cloud + 0x292: swift_sensors + 0x293: blue_bite + 0x294: elias + 0x295: sivantos + 0x296: petzl + 0x297: storm_power + 0x298: eisst + 0x299: inexess_technology_simma + 0x29a: currant + 0x29b: c2_development + 0x29c: blue_sky_scientific_29c + 0x29d: alottazs_labs + 0x29e: kupson + 0x29f: areus_engineering + 0x2a0: impossible_camera + 0x2a1: inventure_track_systems + 0x2a2: locked_up + 0x2a3: itude + 0x2a4: pacific_lock + 0x2a5: tendyron_corporation + 0x2a6: robert_bosch + 0x2a7: illuxtron_international + 0x2a8: mi_sport + 0x2a9: chargelib + 0x2aa: doppler_lab + 0x2ab: bbpos + 0x2ac: rtb_elektronik + 0x2ad: rx_networks + 0x2ae: weather_flow + 0x2af: technicolor_usa + 0x2b0: bestechnic_shanghai + 0x2b1: raden + 0x2b2: jou_zen + 0x2b3: claber + 0x2b4: hyginex + 0x2b5: hanshin_electric_railway + 0x2b6: schneider_electric + 0x2b7: oort_technologies + 0x2b8: chrono_therapeutics + 0x2b9: rinnai + 0x2ba: swissprime_technologies + 0x2bb: koha + 0x2bc: genevac + 0x2bd: chemtronics + 0x2be: seguro_technology + 0x2bf: redbird_flight_simulations + 0x2c0: dash_robotics + 0x2c1: line + 0x2c2: guillemot + 0x2c3: techtronic_power_tools_technology + 0x2c4: wilson_sporting_goods + 0x2c5: lenovo_singapore_pte_ltd + 0x2c6: ayatan_sensors + 0x2c7: electronics_tomorrow + 0x2c8: vasco_data_security_international + 0x2c9: pay_range + 0x2ca: abov_semiconductor + 0x2cb: aina_wireless + 0x2cc: eijkelkamp_soil_water + 0x2cd: bma_ergonomics + 0x2ce: teva_branded_pharmaceutical_products_r_d + 0x2cf: anima + 0x2d0: zero_point_zero_one_three_m + 0x2d1: empatica + 0x2d2: afero + 0x2d3: powercast + 0x2d4: secuyou + 0x2d5: omron + 0x2d6: send_solutions + 0x2d7: nippon_systemware + 0x2d8: neosfar + 0x2d9: fliegl_agrartechnik + 0x2da: gilvader + 0x2db: digi_international_inc_r + 0x2dc: de_walch_technologies + 0x2dd: flint_rehabilitation_devices + 0x2de: samsung_sds + 0x2df: blur_product_development + 0x2e0: university_of_michigan + 0x2e1: victron_energy + 0x2e2: ntt_docomo + 0x2e3: carmanah_technologies + 0x2e4: bytestorm + 0x2e5: espressif_incorporated + 0x2e6: unwire + 0x2e7: connected_yard + 0x2e8: american_music_environments + 0x2e9: sensogram_technologies + 0x2ea: fujitsu + 0x2eb: ardic_technology + 0x2ec: delta_systems + 0x2ed: htc + 0x2ee: citizen_holdings + 0x2ef: smart_innovation + 0x2f0: blackrat_software + 0x2f1: the_idea_cave + 0x2f2: go_pro + 0x2f3: auth_air + 0x2f4: vensi + 0x2f5: indagem_tech + 0x2f6: intemo_technologies + 0x2f7: dream_visions + 0x2f8: runteq + 0x2f9: imagination_technologies + 0x2fa: co_star_t_echnologies + 0x2fb: clarius_mobile_health + 0x2fc: shanghai_frequen_microelectronics + 0x2fd: uwanna + 0x2fe: lierda_science_technology + 0x2ff: silicon_laboratories + 0x300: world_moto + 0x301: giatec_scientific + 0x302: loop_devices + 0x303: iaca_electronique + 0x304: proxy_technologies + 0x305: swipp + 0x306: life_laboratory + 0x307: fuji_industrial + 0x308: surefire + 0x309: dolby_labs + 0x30a: ellisys + 0x30b: magnitude_lighting_converters + 0x30c: hilti + 0x30d: devdata + 0x30e: deviceworx + 0x30f: shortcut_labs + 0x310: sgl_italia + 0x311: peeq_data + 0x312: ducere_technologies + 0x313: dive_nav + 0x314: riig_ai + 0x315: thermo_fisher_scientific + 0x316: ag_measurematics + 0x317: chuo_electronics + 0x318: aspenta_international + 0x319: eugster_frismag + 0x31a: amber_wireless + 0x31b: hq + 0x31c: lab_sensor_solutions + 0x31d: enterlab + 0x31e: eyefi + 0x31f: meta_system + 0x320: sono_electronics + 0x321: jewelbots + 0x322: compumedics + 0x323: rotor_bike_components + 0x324: astro + 0x325: amotus_solutions + 0x326: healthwear_technologies_changzhou + 0x327: essex_electronics + 0x328: grundfos + 0x329: eargo + 0x32a: electronic_design_lab + 0x32b: esylux + 0x32c: nippon_smt + 0x32d: bm_innovations + 0x32e: indoormap + 0x32f: otto_q + 0x330: north_pole_engineering + 0x331: zero_point_zero_one_threeflares_technologies + 0x332: electrocompaniet + 0x333: mul_t_lock + 0x334: corentium + 0x335: enlighted + 0x336: gistic + 0x337: ajp2_holdings + 0x338: cobi + 0x339: blue_sky_scientific_339 + 0x33a: appception + 0x33b: courtney_thorne + 0x33c: virtuosys + 0x33d: tpv_technology + 0x33e: monitra + 0x33f: automation_components + 0x340: letsense + 0x341: etesian_technologies + 0x342: gertec_brasil + 0x343: drekker_development + 0x344: whirl + 0x345: locus_positioning + 0x346: acuity_brands_lighting + 0x347: prevent_biometrics + 0x348: arioneo + 0x349: versa_me + 0x34a: vaddio + 0x34b: libratone + 0x34c: hm_electronics + 0x34d: taser_international + 0x34e: safe_trust + 0x34f: heartland_payment_systems + 0x350: bitstrata_systems + 0x351: pieps + 0x352: i_riding_xiamen_technology + 0x353: alpha_audiotronics + 0x354: toppan_forms + 0x355: sigma_designs + 0x356: spectrum_brands + 0x357: polymap_wireless + 0x358: magni_ware + 0x359: novotec_medical + 0x35a: medicom_innovation_partner + 0x35b: matrix + 0x35c: eaton + 0x35d: kys + 0x35e: naya_health + 0x35f: acromag + 0x360: insulet + 0x361: wellinks + 0x362: on_semiconductor + 0x363: freelap + 0x364: favero_electronics + 0x365: bio_mech_sensor + 0x366: boltt_sports_technologies + 0x367: saphe_international + 0x368: metormote + 0x369: little_bits + 0x36a: set_point_medical + 0x36b: br_controls_products + 0x36c: zipcar + 0x36d: air_bolt + 0x36e: keep_truckin + 0x36f: motiv + 0x370: wazombi_labs_ou + 0x371: orbcomm + 0x372: nixie_labs + 0x373: app_near_me + 0x374: holman_industries + 0x375: expain + 0x376: electronic_temperature_instruments + 0x377: plejd + 0x378: propeller_health + 0x379: shenzhen_i_mco_electronic_technology + 0x37a: algoria + 0x37b: apption_labs + 0x37c: cronologics + 0x37d: microdia + 0x37e: lulabytes + 0x37f: societe_des_produits_nestle + 0x380: llc_mega_f_service + 0x381: sharp + 0x382: precision_outcomes + 0x383: kronos + 0x384: ocosmos + 0x385: embedded_electronic_solutions_ltd_dba_e2_solutions + 0x386: aterica + 0x387: blu_stor_pmc + 0x388: kapsch_traffic_com + 0x389: active_blu + 0x38a: kohler_mira + 0x38b: noke + 0x38c: appion + 0x38d: resmed + 0x38e: crownstone + 0x38f: xiaomi + 0x390: infotech + 0x391: thingsquare + 0x392: t_d + 0x393: lavazza + 0x394: netclearance_systems + 0x395: sdataway + 0x396: bloks + 0x397: lego_system + 0x398: thetatronics + 0x399: nikon + 0x39a: ne_st + 0x39b: south_silicon_valley_microelectronics + 0x39c: ale_international + 0x39d: care_view_communications + 0x39e: school_board + 0x39f: molex + 0x3a0: ivt_wireless + 0x3a1: alpine_labs + 0x3a2: candura_instruments + 0x3a3: smart_movt_technology + 0x3a4: token_zero + 0x3a5: ace_cad_enterprise_co_ltd_acecad + 0x3a6: medela_3a6 + 0x3a7: aero_scout + 0x3a8: esrille + 0x3a9: thinkerly + 0x3aa: exon + 0x3ab: meizu_technology + 0x3ac: smablo + 0x3ad: xi_q + 0x3ae: allswell + 0x3af: comm_n_sense_corp_dba_verigo + 0x3b0: vibradorm + 0x3b1: otodata_wireless_network + 0x3b2: propagation_systems + 0x3b3: midwest_instruments_controls + 0x3b4: alpha_nodus + 0x3b5: pet_pomm + 0x3b6: mattel + 0x3b7: airbly + 0x3b8: a_safe + 0x3b9: frederique_constant + 0x3ba: maxscend_microelectronics + 0x3bb: abbott + 0x3bc: asb_bank + 0x3bd: amadas + 0x3be: applied_science + 0x3bf: i_lumi_solutions + 0x3c0: arch_systems + 0x3c1: ember_technologies + 0x3c2: snapchat + 0x3c3: casambi_technologies + 0x3c4: pico_technology + 0x3c5: st_jude_medical + 0x3c6: intricon + 0x3c7: structural_health_systems + 0x3c8: avvel_international + 0x3c9: gallagher + 0x3ca: in2things_automation + 0x3cb: sysdev + 0x3cc: vonkil_technologies + 0x3cd: wynd_technologies + 0x3ce: contrinex + 0x3cf: mira + 0x3d0: watteam + 0x3d1: density + 0x3d2: iot_pot_india + 0x3d3: sigma_connectivity + 0x3d4: peg_perego + 0x3d5: wyzelink_systems + 0x3d6: yota_devices + 0x3d7: finsecur + 0x3d8: zen_me_labs + 0x3d9: zero_point_zero_one_three_i_ware + 0x3da: en_ocean + 0x3db: instabeat + 0x3dc: nima_labs + 0x3dd: andreas_stihl + 0x3de: nathan_rhoades + 0x3df: grob_technologies + 0x3e0: actions_zhuhai_technology + 0x3e1: spd_development + 0x3e2: sensoan + 0x3e3: qualcomm_life + 0x3e4: chip_ing + 0x3e5: ffly4u + 0x3e6: io_t_instruments + 0x3e7: true_fitness_technology + 0x3e8: reiner_kartengeraete + 0x3e9: shenzhen_lemonjoy_technology + 0x3ea: hello + 0x3eb: evollve + 0x3ec: jigowatts + 0x3ed: basic_micro_com + 0x3ee: cube_technologies + 0x3ef: foolography + 0x3f0: clink + 0x3f1: hestan_smart_cooking + 0x3f2: window_master + 0x3f3: flowscape + 0x3f4: pal_technologies + 0x3f5: where + 0x3f6: iton_technology + 0x3f7: owl_labs + 0x3f8: rockford + 0x3f9: becon_technologies + 0x3fa: vyassoft_technologies + 0x3fb: nox_medical + 0x3fc: kimberly_clark + 0x3fd: trimble_navigation + 0x3fe: littelfuse + 0x3ff: withings + 0x400: i_developer_it_beratung_ug + 0x401: relations + 0x402: sears_holdings + 0x403: gantner_electronic + 0x404: authomate + 0x405: vertex_international + 0x406: airtago + 0x407: swiss_audio + 0x408: to_get_home + 0x409: axis + 0x40a: openmatics + 0x40b: jana_care + 0x40c: senix + 0x40d: north_star_battery + 0x40e: skf_u_k + 0x40f: co_ax_technology + 0x410: fender_musical_instruments + 0x411: luidia + 0x412: sefam + 0x413: wireless_cables + 0x414: lightning_protection_international + 0x415: uber_technologies + 0x416: soda + 0x417: fatigue_science + 0x418: alpine_electronics + 0x419: novalogy + 0x41a: friday_labs + 0x41b: ortho_accel_technologies + 0x41c: water_guru + 0x41d: benning_elektrotechnik_und_elektronik + 0x41e: dell_computer + 0x41f: kopin + 0x420: tec_bakery + 0x421: backbone_labs + 0x422: delsey + 0x423: chargifi + 0x424: trainesense + 0x425: unify_software_and_solutions + 0x426: husqvarna + 0x427: focus_fleet_and_fuel_management + 0x428: small_loop + 0x429: prolon + 0x42a: bd_medical + 0x42b: i_micro_med + 0x42c: ticto + 0x42d: meshtech + 0x42e: mem_cachier + 0x42f: danfoss + 0x430: snap_styk + 0x431: amway + 0x432: silk_labs + 0x433: pillsy + 0x434: hatch_baby + 0x435: blocks_wearables + 0x436: drayson_technologies_europe + 0x437: e_best_iot + 0x438: helvar + 0x439: radiance_technologies + 0x43a: nuheara + 0x43b: appside + 0x43c: de_laval + 0x43d: coiler + 0x43e: thermomedics + 0x43f: tentacle_sync + 0x440: valencell + 0x441: i_proto_xi + 0x442: secom + 0x443: tucker_international + 0x444: metanate + 0x445: kobian_canada + 0x446: netgear + 0x447: fabtronics_australia + 0x448: grand_centrix + 0x449: zero_point_zero_one_one_up_usa_com + 0x44a: shimano + 0x44b: nain + 0x44c: life_style_lock + 0x44d: vega_grieshaber + 0x44e: xtrava + 0x44f: tts_tooltechnic_systems + 0x450: teenage_engineering + 0x451: tunstall_nordic + 0x452: svep_design_center + 0x453: qorvo_utrecht + 0x454: sphinx_electronics + 0x455: atomation + 0x456: nemik_consulting + 0x457: rf_innovation + 0x458: mini_solution + 0x459: lumenetix + 0x45a: zero_point_zero_seven_two_zero_four_eight_four_five_zero_ontario + 0x45b: spaceek + 0x45c: delta_t + 0x45d: boston_scientific + 0x45e: nuviz + 0x45f: real_time_automation + 0x460: kolibree + 0x461: vhf_elektronik + 0x462: bonsai_systems + 0x463: fathom_systems + 0x464: bellman_symfon + 0x465: international_forte + 0x466: cycle_labs_solutions + 0x467: codenex + 0x468: kynesim + 0x469: palago + 0x46a: insigma + 0x46b: pmd_solutions + 0x46c: qingdao_realtime_technology + 0x46d: bega_gantenbrink_leuchten + 0x46e: pambor + 0x46f: develco_products + 0x470: i_design + 0x471: ti_vo + 0x472: control_j + 0x473: steelcase + 0x474: i_apartment + 0x475: icom + 0x476: oxstren_wearable_technologies + 0x477: blue_spark_technologies + 0x478: far_site_communications + 0x479: mywerk_system + 0x47a: sinosun_technology + 0x47b: miyoshi_electronics + 0x47c: powermat + 0x47d: occly + 0x47e: our_hub_dev_iv + 0x47f: pro_mark + 0x480: dynometrics + 0x481: quintrax + 0x482: pos_tuning_udo_vosshenrich + 0x483: multi_care_systems + 0x484: revol_technologies + 0x485: skidata + 0x486: dev_tecnologia_industria_comercio_e_manutencao_de_equipamentos_ltda_me + 0x487: centrica_connected_home + 0x488: automotive_data_solutions + 0x489: igarashi_engineering + 0x48a: taelek + 0x48b: cp_electronics + 0x48c: vectronix + 0x48d: s_labs + 0x48e: companion_medical + 0x48f: blue_kitchen + 0x490: matting + 0x491: sorex_wireless_solutions + 0x492: adc_technology + 0x493: lynxemi + 0x494: sennheiser_electronic + 0x495: lmt_mercer + 0x496: polymorphic_labs + 0x497: cochlear + 0x498: meter_group_inc_usa + 0x499: ruuvi_innovations + 0x49a: situne + 0x49b: n_visti + 0x49c: dy_ocean + 0x49d: uhlmann_zacher + 0x49e: and_xor + 0x49f: tictote + 0x4a0: vypin + 0x4a1: pni_sensor + 0x4a2: ovr_engineered + 0x4a3: gt_tronics_hk + 0x4a4: herbert_waldmann + 0x4a5: guangzhou_fii_o_electronics_technology + 0x4a6: vinetech + 0x4a7: dallas_logic + 0x4a8: bio_tex + 0x4a9: discovery_sound_technology + 0x4aa: linkio + 0x4ab: harbortronics + 0x4ac: undagrid + 0x4ad: shure + 0x4ae: erm_electronic_systems + 0x4af: biorower_handelsagentur + 0x4b0: weba_sport_und_med_artikel + 0x4b1: kartographers_technologies + 0x4b2: the_shadow_on_the_moon + 0x4b3: mobike_hong_kong + 0x4b4: inuheat + 0x4b5: swiftronix + 0x4b6: diagnoptics_technologies + 0x4b7: analog_devices + 0x4b8: soraa + 0x4b9: csr_building_products + 0x4ba: crestron_electronics + 0x4bb: neatebox + 0x4bc: draegerwerk + 0x4bd: albyn_medical + 0x4be: averos_fzco + 0x4bf: vit_initiative + 0x4c0: statsports_international + 0x4c1: sospitas + 0x4c2: dmet_products + 0x4c3: mantracourt_electronics + 0x4c4: te_am_hutchins + 0x4c5: seibert_williams_glass + 0x4c6: insta + 0x4c7: svantek + 0x4c8: shanghai_flyco_electrical_appliance + 0x4c9: thornwave_labs + 0x4ca: steiner_optik + 0x4cb: novo_nordisk + 0x4cc: enflux + 0x4cd: safetech_products + 0x4ce: goooled + 0x4cf: dom_sicherheitstechnik + 0x4d0: olympus + 0x4d1: kts + 0x4d2: anloq_technologies + 0x4d3: queercon + 0x4d4: zero_point_zero_one_fiveth_element + 0x4d5: gooee + 0x4d6: lugloc + 0x4d7: blincam + 0x4d8: fujifilm + 0x4d9: rand_mc_nally + 0x4da: franceschi_marina + 0x4db: engineered_audio + 0x4dc: iottive_opc + 0x4dd: zero_point_zero_one_four_mod_technology + 0x4de: lutron_electronics + 0x4df: emerson + 0x4e0: guardtec + 0x4e1: reactec + 0x4e2: ellie_grid + 0x4e3: under_armour + 0x4e4: woodenshark + 0x4e5: avack + 0x4e6: smart_solution_technology + 0x4e7: rehabtronics + 0x4e8: stabilo_international + 0x4e9: busch_jaeger_elektro + 0x4ea: pacific_bioscience_laboratories + 0x4eb: bird_home_automation + 0x4ec: motorola_solutions + 0x4ed: r9_technology + 0x4ee: auxivia + 0x4ef: daisy_works + 0x4f0: kosi + 0x4f1: theben + 0x4f2: in_dreamer_techsol + 0x4f3: cerevast_medical + 0x4f4: zan_compute + 0x4f5: pirelli_tyre + 0x4f6: mc_lear + 0x4f7: shenzhen_huiding_technology + 0x4f8: convergence_systems + 0x4f9: interactio + 0x4fa: androtec + 0x4fb: benchmark_drives + 0x4fc: swing_lync_l_l_c + 0x4fd: tapkey + 0x4fe: woosim_systems + 0x4ff: microsemi + 0x500: wiliot + 0x501: polaris_ind + 0x502: specifi_kali + 0x503: locoroll + 0x504: phyplus + 0x505: inplay_technologies + 0x506: hager + 0x507: yellowcog + 0x508: axes_system + 0x509: my_lifter + 0x50a: shake_on + 0x50b: vibrissa + 0x50c: osram + 0x50d: tr_systems + 0x50e: yichip_microelectronics_hangzhou + 0x50f: foundation_engineering + 0x510: uni_electronics + 0x511: brookfield_equinox + 0x512: soprod + 0x513: zero_point_zero_seven_nine_nine_seven_four_zero_nine_one_canada + 0x514: fibro + 0x515: rb_controls + 0x516: footmarks + 0x517: amtronic_sverige + 0x518: mamorio + 0x519: tyto_life + 0x51a: leica_camera + 0x51b: angee_technologies + 0x51c: edps + 0x51d: off_line + 0x51e: detect_blue + 0x51f: setec + 0x520: target + 0x521: iai + 0x522: ns_tech + 0x523: mtg + 0x524: hangzhou_i_magic_technology + 0x525: hongkong_nano_ic_technologies + 0x526: honeywell_international + 0x527: albrecht_jung + 0x528: lunera_lighting + 0x529: lumen + 0x52a: keynes_controls + 0x52b: novartis + 0x52c: geosatis + 0x52d: exfo + 0x52e: ledvance + 0x52f: center_id + 0x530: adolene + 0x531: d_m_holdings + 0x532: cresco_wireless + 0x533: nura_operations + 0x534: frontiergadget + 0x535: smart_component_technologies + 0x536: ztr_control_systems + 0x537: meta_logics + 0x538: medela_538 + 0x539: opple_lighting + 0x53a: savitech + 0x53b: prodigy + 0x53c: screenovate_technologies + 0x53d: tesa + 0x53e: clim8 + 0x53f: silergy + 0x540: silver_plus + 0x541: sharknet + 0x542: mist_systems + 0x543: miwa_lock + 0x544: ortho_sensor + 0x545: candy_hoover + 0x546: apexar_technologies + 0x547: logicdata + 0x548: knick_elektronische_messgeraete + 0x549: smart_technologies_and_investment + 0x54a: linough + 0x54b: advanced_electronic_designs + 0x54c: carefree_scott_fetzer + 0x54d: sensome + 0x54e: fortronik_storitve + 0x54f: sinnoz + 0x550: versa_networks + 0x551: sylero + 0x552: avempace + 0x553: nintendo + 0x554: national_instruments + 0x555: krohne_messtechnik + 0x556: otodynamics + 0x557: arwin_technology + 0x558: benegear + 0x559: newcon_optik + 0x55a: candy_house + 0x55b: franklin_technology + 0x55c: lely + 0x55d: valve + 0x55e: hekatron_vertriebs + 0x55f: protech_s_a_s_di_girardi_andrea_c + 0x560: sarita_care_tech + 0x561: finder + 0x562: thalmic_labs + 0x563: steinel_vertrieb + 0x564: beghelli + 0x565: beijing_smartspace_technologies + 0x566: core_transport_technologies_nz + 0x567: xiamen_everesports_goods + 0x568: bodyport + 0x569: audionics_system + 0x56a: flipnavi + 0x56b: rion + 0x56c: long_range_systems + 0x56d: redmond_industrial + 0x56e: vizpin + 0x56f: bike_finder + 0x570: consumer_sleep_solutions + 0x571: psikick + 0x572: ant_tail_com + 0x573: lighting_science + 0x574: affordable_electronics + 0x575: integral_memroy + 0x576: globalstar + 0x577: true_wearables + 0x578: wellington_drive_technologies + 0x579: ensemble_tech + 0x57a: omni_remotes + 0x57b: duracell_u_s_operations + 0x57c: toor_technologies + 0x57d: instinct_performance + 0x57e: beco + 0x57f: scuf_gaming_international + 0x580: aranz_medical + 0x581: lys_technologies + 0x582: breakwall_analytics + 0x583: code_blue_communications + 0x584: gira_giersiepen + 0x585: hearing_lab_technology + 0x586: legrand + 0x587: derichs + 0x588: alt_teknik + 0x589: star_technologies + 0x58a: start_today + 0x58b: maxim_integrated_products + 0x58c: merck_kommanditgesellschaft_auf_aktien + 0x58d: jungheinrich_aktiengesellschaft + 0x58e: oculus_vr + 0x58f: hendon_semiconductors + 0x590: pur3 + 0x591: viasat + 0x592: izitherm + 0x593: spaulding_clinical_research + 0x594: kohler + 0x595: inor_process + 0x596: my_smart_blinds + 0x597: radio_pulse + 0x598: rapitag + 0x599: lazlo326 + 0x59a: teledyne_lecroy + 0x59b: dataflow_systems + 0x59c: macrogiga_electronics + 0x59d: tandem_diabetes_care + 0x59e: polycom + 0x59f: fisher_paykel_healthcare + 0x5a0: rcp_software + 0x5a1: shanghai_xiaoyi_technology + 0x5a2: adherium_nz + 0x5a3: axiomware_systems + 0x5a4: o_e_m_controls + 0x5a5: kiiroo + 0x5a6: telecon_mobile + 0x5a7: sonos + 0x5a8: tom_allebrandi_consulting + 0x5a9: monidor + 0x5aa: tramex + 0x5ab: nofence + 0x5ac: goer_tek_dynaudio + 0x5ad: inia + 0x5ae: carmate_mfg + 0x5af: ov_loop + 0x5b0: new_tec + 0x5b1: medallion_instrumentation_systems + 0x5b2: carel_industries + 0x5b3: parabit_systems + 0x5b4: white_horse_scientific + 0x5b5: verisilicon + 0x5b6: elecs_industry + 0x5b7: beijing_pinecone_electronics + 0x5b8: ambystoma_labs + 0x5b9: suzhou_pairlink_network_technology + 0x5ba: igloohome + 0x5bb: oxford_metrics + 0x5bc: leviton_mfg + 0x5bd: ulc_robotics + 0x5be: rfid_global_by_softwork + 0x5bf: real_world_systems + 0x5c0: nalu_medical + 0x5c1: p_i_engineering + 0x5c2: grote_industries + 0x5c3: runtime + 0x5c4: codecoup_sp_z_o_o_sp_k + 0x5c5: selve + 0x5c6: smart_animal_training_systems + 0x5c7: lippert_components + 0x5c8: somfy + 0x5c9: tbs_electronics + 0x5ca: mhl_custom + 0x5cb: lucent_wear + 0x5cc: watts_electronics + 0x5cd: rj_brands + 0x5ce: v_zug + 0x5cf: biowatch + 0x5d0: anova_applied_electronics + 0x5d1: lindab + 0x5d2: frogblue_technology + 0x5d3: acurable + 0x5d4: lamplight + 0x5d5: tegam + 0x5d6: zhuhai_jieli_technology + 0x5d7: modum_io + 0x5d8: farm_jenny + 0x5d9: toyo_electronics + 0x5da: applied_neural_research + 0x5db: avid_identification_systems + 0x5dc: petronics + 0x5dd: essentim + 0x5de: qt_medical + 0x5df: virtualclinic_direct + 0x5e0: viper_design + 0x5e1: human + 0x5e2: st_ap_ptronics + 0x5e3: elemental_machines + 0x5e4: taiyo_yuden + 0x5e5: ineo_energy_systems + 0x5e6: motion_instruments + 0x5e7: pressure_pro + 0x5e8: cowboy + 0x5e9: iconmobile + 0x5ea: acs_control_system + 0x5eb: bayerische_motoren_werke + 0x5ec: gycom_svenska + 0x5ed: fuji_xerox + 0x5ee: glide + 0x5ef: sikom + 0x5f0: beken + 0x5f1: the_linux_foundation + 0x5f2: try_and_e + 0x5f3: see_scan + 0x5f4: clearity + 0x5f5: gs_tag + 0x5f6: dp_technics + 0x5f7: tracmo + 0x5f8: anki + 0x5f9: hagleitner_hygiene_international + 0x5fa: konami_sports_life + 0x5fb: arblet + 0x5fc: masbando + 0x5fd: innoseis + 0x5fe: niko + 0x5ff: wellnomics + 0x600: i_robot + 0x601: schrader_electronics + 0x602: geberit_international + 0x603: fourth_evolution + 0x604: cell2_jack + 0x605: fmw_electronic_futterer_u_maier_wolf + 0x606: john_deere + 0x607: rookery_technology + 0x608: key_safe_cloud + 0x609: buchi_labortechnik + 0x60a: iq_air + 0x60b: triax_technologies + 0x60c: vuzix + 0x60d: tdk + 0x60e: blueair + 0x60f: signify_netherlands + 0x610: adh_guardian_usa + 0x611: beurer + 0x612: playfinity + 0x613: hans_dinslage + 0x614: on_asset_intelligence + 0x615: inter_action + 0x616: os42_ug_haftungsbeschraenkt + 0x617: wizconnected + 0x618: audio_technica + 0x619: six_guys_labs + 0x61a: r_w_beckett + 0x61b: silex_technology + 0x61c: univations + 0x61d: sens_innovation + 0x61e: diamond_kinetics + 0x61f: phrame + 0x620: forciot + 0x621: noordung + 0x622: beam_labs + 0x623: philadelphia_scientific_u_k + 0x624: biovotion + 0x625: square_panda + 0x626: amplifico + 0x627: weg + 0x628: ensto + 0x629: phonepe + 0x62a: lunatico_astronomia + 0x62b: minebea_mitsumi + 0x62c: as_pion + 0x62d: vossloh_schwabe_deutschland + 0x62e: procept + 0x62f: onkyo + 0x630: asthrea + 0x631: fortiori_design + 0x632: hugo_muller + 0x633: wangi_lai_plt + 0x634: fanstel + 0x635: crookwood + 0x636: electronica_integral_de_sonido + 0x637: gi_p_innovation_tools + 0x638: lx_solutions + 0x639: shenzhen_minew_technologies + 0x63a: prolojik + 0x63b: kromek + 0x63c: contec_medical_systems + 0x63d: xradio_technology + 0x63e: the_indoor_lab + 0x63f: ldl_technology + 0x640: parkifi + 0x641: revenue_collection_systems_france + 0x642: bluetrum_technology + 0x643: makita + 0x644: apogee_instruments + 0x645: bm3 + 0x646: sgv_group_holding + 0x647: med_el + 0x648: ultune_technologies + 0x649: ryeex_technology + 0x64a: open_research_institute + 0x64b: scale_tec + 0x64c: zumtobel + 0x64d: i_loq + 0x64e: krux_works_technologies + 0x64f: digital_matter + 0x650: coravin + 0x651: stasis_labs + 0x652: itz_innovations_und_technologiezentrum + 0x653: meggitt + 0x654: ledlenser + 0x655: renishaw + 0x656: zhu_hai_advan_pro_technology + 0x657: meshtronix + 0x658: payex_norge + 0x659: un_seen_technologies + 0x65a: zound_industries_international + 0x65b: sesam_solutions + 0x65c: pix_art_imaging + 0x65d: panduit + 0x65e: alo + 0x65f: ricoh + 0x660: rtc_industries + 0x661: mode_lighting + 0x662: particle_industries + 0x663: advanced_telemetry_systems + 0x664: rha_technologies + 0x665: pure_international + 0x666: wto_werkzeug_einrichtungen + 0x667: spark_technology_labs + 0x668: bleb_technology + 0x669: livanova_usa + 0x66a: brady_worldwide + 0x66b: dewert_okin + 0x66c: ztove + 0x66d: venso_eco_solutions + 0x66e: eurotronik_kranj + 0x66f: hug_technology + 0x670: gema_switzerland + 0x671: buzz_products + 0x672: kopi + 0x673: innova_ideas + 0x674: be_spoon + 0x675: deco_enterprises + 0x676: expai_solutions + 0x677: innovation_first + 0x678: sabik_offshore + 0x679: zero_point_zero_one_fouriiii_innovations + 0x67a: the_energy_conservatory + 0x67b: i_farm + 0x67c: tile + 0x67d: form_athletica + 0x67e: mbient_lab + 0x67f: netgrid_s_n_c_di_bissoli_matteo_camporeale_simone_tognetti_federico + 0x680: mannkind + 0x681: trade_fides + 0x682: photron + 0x683: eltako + 0x684: dermalapps + 0x685: greenwald_industries + 0x686: in_qs + 0x687: cherry + 0x688: amsted_digital_solutions + 0x689: tacx + 0x68a: raytac + 0x68b: jiangsu_teranovo_tech + 0x68c: changzhou_sound_dragon_electronics_and_acoustics + 0x68d: jet_beep + 0x68e: razer + 0x68f: jrm + 0x690: eccrine_systems + 0x691: curie_point + 0x692: georg_fischer + 0x693: hach_danaher + 0x694: t_a_laboratories + 0x695: koki_holdings + 0x696: gunakar + 0x697: stemco_products + 0x698: wood_it_security + 0x699: random_lab + 0x69a: adero + 0x69b: dragonchip + 0x69c: noomi + 0x69d: vakaros + 0x69e: delta_electronics + 0x69f: flow_motion_technologies + 0x6a0: obiq_location_technology + 0x6a1: cardo_systems + 0x6a2: globalworx + 0x6a3: nymbus + 0x6a4: sanyo_techno_solutions_tottori + 0x6a5: tekzitel + 0x6a6: roambee + 0x6a7: chipsea_technologies_shen_zhen + 0x6a8: gd_midea_air_conditioning_equipment + 0x6a9: soundmax_electronics + 0x6aa: produal + 0x6ab: hms_industrial_networks + 0x6ac: ingchips_technology + 0x6ad: innova_sea_systems + 0x6ae: sense_q + 0x6af: shoof_technologies + 0x6b0: brk_brands + 0x6b1: simpli_safe + 0x6b2: tussock_innovation_2013 + 0x6b3: the_hablab + 0x6b4: sencilion + 0x6b5: wabilogic + 0x6b6: sociometric_solutions + 0x6b7: i_cognize + 0x6b8: shade_craft + 0x6b9: beflex + 0x6ba: beaconzone + 0x6bb: leaftronix_analogic_solutions + 0x6bc: tws + 0x6bd: abb_6bd + 0x6be: hit_seed + 0x6bf: delcom_products + 0x6c0: came + 0x6c1: alarm_com_holdings + 0x6c2: measurlogic + 0x6c3: king_i_electronics + 0x6c4: dream_labs + 0x6c5: urban_compass + 0x6c6: simm_tronic + 0x6c7: somatix + 0x6c8: storz_bickel + 0x6c9: mylaps + 0x6ca: shenzhen_zhongguang_infotech_technology_development + 0x6cb: dyeware + 0x6cc: dongguan_smart_action_technology + 0x6cd: dig + 0x6ce: fior_gentz + 0x6cf: belparts + 0x6d0: etekcity + 0x6d1: meyer_sound_laboratories + 0x6d2: ceo_tronics + 0x6d3: tri_teq_lock_and_security + 0x6d4: dynakode_technology + 0x6d5: sensirion + 0x6d6: jct_healthcare + 0x6d7: fuba_automotive_electronics + 0x6d8: aw + 0x6d9: shanghai_mountain_view_silicon + 0x6da: zliide_technologies + 0x6db: automatic_labs + 0x6dc: industrial_network_controls + 0x6dd: intellithings + 0x6de: navcast + 0x6df: hubbell_lighting + 0x6e0: avaya + 0x6e1: milestone_av_technologies + 0x6e2: alango_technologies + 0x6e3: spinlock + 0x6e4: aluna + 0x6e5: optex + 0x6e6: nihon_dengyo_kousaku + 0x6e7: velux + 0x6e8: almendo_technologies + 0x6e9: zmartfun_electronics + 0x6ea: safe_line_sweden + 0x6eb: houston_radar + 0x6ec: sigur + 0x6ed: j_neades + 0x6ee: avantis_systems + 0x6ef: alcare + 0x6f0: chargy_technologies + 0x6f1: shibutani + 0x6f2: trapper_data + 0x6f3: alfred_international + 0x6f4: near_field_solutions + 0x6f5: vigil_technologies + 0x6f6: vitulo_plus + 0x6f7: wilka_schliesstechnik + 0x6f8: body_plus_technology + 0x6f9: happybrush + 0x6fa: enequi + 0x6fb: sartorius + 0x6fc: tom_communication_industrial + 0x6fd: ess_embedded_system_solutions + 0x6fe: mahr + 0x6ff: redpine_signals + 0x700: traq_freq + 0x701: pafers_tech + 0x702: akciju_sabiedriba_saf_tehnika + 0x703: beijing_jingdong_century_trading + 0x704: jbx_designs + 0x705: ab_electrolux + 0x706: wernher_von_braun_center_for_a_sdvanced_research + 0x707: essity_hygiene_and_health_aktiebolag + 0x708: be_interactive + 0x709: carewear + 0x70a: huf_hulsbeck_furst + 0x70b: element_products + 0x70c: beijing_winner_microelectronics + 0x70d: smart_snugg + 0x70e: five + 0x70f: california_things + 0x710: audiodo + 0x711: abax + 0x712: bull + 0x713: respiri + 0x714: mind_peace_safety + 0x715: vgyan_solutions + 0x716: altonics + 0x717: i_qsquare + 0x718: idibaix_enginneering + 0x719: ecsg + 0x71a: revsmart_wearable_hk + 0x71b: precor + 0x71c: f5_sports + 0x71d: exo_tic_systems + 0x71e: dongguan_hele_electronics + 0x71f: dongguan_liesheng_electronic + 0x720: oculeve + 0x721: clover_network + 0x722: xiamen_eholder_electronics + 0x723: ford_motor + 0x724: guangzhou_super_sound_information_technology + 0x725: tedee + 0x726: phc + 0x727: stalkit + 0x728: eli_lilly + 0x729: swara_link_technologies + 0x72a: jmr_embedded_systems + 0x72b: bitkey + 0x72c: gwa_hygiene + 0x72d: safera + 0x72e: open_platform_systems + 0x72f: one_plus_electronics_shenzhen + 0x730: wildlife_acoustics + 0x731: ablic + 0x732: dairy_tech + 0x733: iguanavation + 0x734: di_us_computing + 0x735: up_right_technologies + 0x736: francis_fund + 0x737: llc_navitek + 0x738: glass_security + 0x739: jiangsu_qinheng + 0x73a: chandler_systems + 0x73b: fantini_cosmi + 0x73c: acubit + 0x73d: beijing_hao_heng_tian_tech + 0x73e: bluepack + 0x73f: beijing_unisoc_technologies + 0x740: hitiq + 0x741: mac + 0x742: dml + 0x743: sanofi + 0x744: socomec + 0x745: wiznova + 0x746: seitec_elektronik + 0x747: or_technologies + 0x748: guang_zhou_ku_gou_computer_technology + 0x749: diaodiao_beijing_technology + 0x74a: illusory_studios + 0x74b: sarvavid_software_solutions + 0x74c: iopool + 0x74d: amtech_systems + 0x74e: eagle_detection + 0x74f: mediatech + 0x750: hamilton_professional_services_of_canada + 0x751: changsha_jemo_ic_design + 0x752: elatec + 0x753: jlg_industries + 0x754: michael_parkin + 0x755: brother_industries + 0x756: lumens_for_less + 0x757: ela_innovation + 0x758: uman_sense + 0x759: shanghai_in_geek_cyber_security + 0x75a: harman + 0x75b: smart_sensor_devices + 0x75c: antitronics + 0x75d: rhombus_systems + 0x75e: katerra + 0x75f: remote_solution + 0x760: vimar + 0x761: mantis_tech + 0x762: ter_opta + 0x763: pikolin + 0x764: wwzn_information_technology + 0x765: voxx_international + 0x766: art_and_program + 0x767: nitto_denko_asia_technical_centre + 0x768: peloton_interactive + 0x769: force_impact_technologies + 0x76a: dmac_mobile_developments + 0x76b: engineered_medical_technologies + 0x76c: noodle_technology + 0x76d: graesslin + 0x76e: wu_qi_technologies + 0x76f: successful_endeavours + 0x770: inno_con_medical + 0x771: corvex_connected_safety + 0x772: thirdwayv + 0x773: echoflex_solutions + 0x774: c_max_asia + 0x775: zero_point_zero_one_foure_business + 0x776: cyber_transport_control + 0x777: cue + 0x778: koamtac + 0x779: loopshore + 0x77a: niruha_systems + 0x77b: amater_z + 0x77c: radius + 0x77d: sensority + 0x77e: sparkage + 0x77f: glenview_software + 0x780: finch_technologies + 0x781: qingping_technology_beijing + 0x782: device_drive + 0x783: esember_limited_liability + 0x784: audifon + 0x785: o2_micro + 0x786: hlp_controls + 0x787: pangaea_solution + 0x788: bubbly_net + 0x78a: the_wildflower_foundation + 0x78b: optikam_tech + 0x78c: minibrew_holding + 0x78d: cybex + 0x78e: fujimic_niigata + 0x78f: hanna_instruments + 0x790: kompan + 0x791: scosche_industries + 0x792: provo_craft + 0x793: aev + 0x794: the_coca_cola + 0x795: gastec + 0x796: star_leaf + 0x797: water_i_d + 0x798: holo_kit + 0x799: plant_choir + 0x79a: guang_dong_oppo_mobile_telecommunications + 0x79b: cst_electronics_proprietary + 0x79c: sky_uk + 0x79d: digibale + 0x79e: smartloxx + 0x79f: pune_scientific + 0x7a0: regent_beleuchtungskorper + 0x7a1: apollo_neuroscience + 0x7a2: roku + 0x7a3: comcast_cable + 0x7a4: xiamen_mage_information_technology + 0x7a5: rab_lighting + 0x7a6: musen_connect + 0x7a7: zume + 0x7a8: conbee + 0x7a9: bruel_kjaer_sound_vibration + 0x7aa: the_kroger + 0x7ab: granite_river_solutions + 0x7ac: loupe_deck + 0x7ad: new_h3_c_technologies + 0x7ae: aurea_solucoes_tecnologicas + 0x7af: hong_kong_bouffalo_lab + 0x7b0: gv_concepts + 0x7b1: thomas_dynamics + 0x7b2: moeco_iot + 0x7b3: zero_point_zero_one_two_n_telekomunikace + 0x7b4: hormann_kg_antriebstechnik + 0x7b5: crono_chip + 0x7b6: soundbrenner + 0x7b7: etablissements_georges_renault + 0x7b8: i_swip + 0x7b9: epona_biotec + 0x7ba: battery_biz + 0x7bb: epic + 0x7bc: kd_circuits + 0x7bd: genedrive_diagnostics + 0x7be: axentia_technologies + 0x7bf: regula + 0x7c0: biral + 0x7c1: a_w_chesterton + 0x7c2: radinn + 0x7c3: cim_techniques + 0x7c4: johnson_health_tech_na + 0x7c5: june_life + 0x7c6: bluenetics + 0x7c7: iaconic_design + 0x7c8: wrlds_creations + 0x7c9: skullcandy + 0x7ca: modul_system_hh + 0x7cb: west_pharmaceutical_services + 0x7cc: barnacle_systems + 0x7cd: smart_wave_technologies_canada + 0x7ce: shanghai_top_chip_microelectronics_tech + 0x7cf: neo_sensory + 0x7d0: hangzhou_tuya_information_technology + 0x7d1: shanghai_panchip_microelectronics + 0x7d2: react_accessibility + 0x7d3: livnex + 0x7d4: kano_computing + 0x7d5: hoots_classic + 0x7d6: ecobee + 0x7d7: nanjing_qinheng_microelectronics + 0x7d8: solutions_ambra + 0x7d9: micro_design + 0x7da: starlite + 0x7db: remedee_labs + 0x7dc: thing_os + 0x7dd: linear_circuits + 0x7de: unlimited_engineering + 0x7df: snap_on + 0x7e0: edifier_international + 0x7e1: lucie_labs + 0x7e2: alfred_kaercher + 0x7e3: audiowise_technology + 0x7e4: geeksme + 0x7e5: minut + 0x7e6: autogrow_systems + 0x7e7: komfort_iq + 0x7e8: packetcraft + 0x7e9: hafele + 0x7ea: shape_log + 0x7eb: novabase + 0x7ec: frecce + 0x7ed: joule_iq + 0x7ee: kidz_tek + 0x7ef: aktiebolaget_sandvik_coromant + 0x7f0: e_moola_com + 0x7f1: gsm_innovations + 0x7f2: serene + 0x7f3: digisine_energytech + 0x7f4: medirlab_orvosbiologiai_fejleszto_korlatolt_felelossegu_tarsasag + 0x7f5: byton_north_america + 0x7f6: shenzhen_tonli_science_and_technology_development + 0x7f7: cesar_systems + 0x7f8: quip_nyc + 0x7f9: direct_communication_solutions + 0x7fa: klipsch + 0x7fb: access + 0x7fc: renault + 0x7fd: jsk + 0x7fe: birota + 0x7ff: maxon_motor + 0x800: optek + 0x801: cronus_electronics + 0x802: nant_sound + 0x803: domintell + 0x804: andon_health + 0x805: urbanminded + 0x806: tyri_sweden + 0x807: ecd_electronic_components_gmb_h_dresden + 0x808: sistemas_kern_sociedad_anomina + 0x809: trulli_audio + 0x80a: altaneos + 0x80b: nanoleaf_canada + 0x80c: ingy + 0x80d: azbil + 0x80e: tattcom + 0x80f: paradox_engineering + 0x810: leco + 0x811: becker_antriebe + 0x812: mstream_technologies + 0x813: flextronics_international_usa + 0x814: ossur + 0x815: skc + 0x816: spica_systems + 0x817: wangs_alliance + 0x818: tatwah + 0x819: hunter_douglas + 0x81a: shenzhen_conex + 0x81b: dim3 + 0x81c: bobrick_washroom_equipment + 0x81d: potrykus_holdings_and_development + 0x81e: i_nform_technology + 0x81f: e_sense_lab + 0x820: brilliant_home_technology + 0x821: inova_geophysical + 0x822: adafruit_industries + 0x823: nexite + 0x824: zero_point_zero_one_eight_power + 0x825: cme + 0x826: hyundai_motor + 0x827: kickmaker + 0x828: shanghai_suisheng_information_technology + 0x829: hexagon + 0x82a: mitutoyo + 0x82b: shenzhen_fitcare_electronics + 0x82c: ingics_technology + 0x82d: incus_performance + 0x82e: abb_82e + 0x82f: blippit + 0x830: core_health_and_fitness + 0x831: foxble + 0x832: intermotive + 0x833: conneqtech + 0x834: riken_keiki + 0x835: canopy_growth_835 + 0x836: bitwards + 0x837: vivo_mobile_communication + 0x838: etymotic_research + 0x839: a_puissance_3 + 0x83a: bpw_bergische_achsen_kommanditgesellschaft + 0x83b: piaggio_fast_forward + 0x83c: beer_tech + 0x83d: tokenize + 0x83e: zorachka + 0x83f: d_link + 0x840: down_range_systems + 0x841: general_luminaire_shanghai + 0x842: tangshan_hong_jia_electronic_technology + 0x843: fragrance_delivery_technologies + 0x844: pepperl_fuchs + 0x845: dometic + 0x846: u_sound + 0x847: dnanudge + 0x848: juju_joints_canada + 0x849: dopple_technologies + 0x84a: arcom + 0x84b: biotechware + 0x84c: orso + 0x84d: safe_port + 0x84e: carol_cole + 0x84f: embedded_fitness + 0x850: yealink_xiamen_network_technology + 0x851: subeca + 0x852: cognosos + 0x853: pektron + 0x854: tap_sound_system + 0x855: helios_hockey + 0x856: canopy_growth_856 + 0x857: parsyl + 0x858: soundboks + 0x859: blue_up + 0x85a: dakatech + 0x85b: ricoh_electronic_devices + 0x85c: acos + 0x85d: guilin_zhishen_information_technology + 0x85e: krog_systems + 0x85f: compegps_team_sociedad_limitada + 0x860: alflex_products + 0x861: smart_sensor_labs + 0x862: smart_drive + 0x863: yo_tronics_technology + 0x864: rafaelmicro + 0x865: emergency_lighting_products + 0x866: laonz + 0x867: western_digital_techologies + 0x868: wi_osense + 0x869: evva_sicherheitstechnologie + 0x86a: odic + 0x86b: pacific_track + 0x86c: revvo_technologies + 0x86d: biometrika + 0x86e: vorwerk_elektrowerke + 0x86f: trackunit + 0x870: wyze_labs + 0x871: dension_elektronikai + 0x872: zero_point_zero_two_one_one_health_technologies + 0x873: innophase + 0x874: treegreen + 0x875: berner_international + 0x876: smart_res_q + 0x877: tome + 0x878: the_chamberlain + 0x879: mizuno + 0x87a: zrf + 0x87b: bystamp + 0x87c: crosscan + 0x87d: konftel + 0x87e: zero_point_zero_one_onebar_net + 0x87f: phillips_connect_technologies + 0x880: imagi_labs + 0x881: optalert + 0x882: psyonic + 0x883: wintersteiger + 0x884: controlid_industria_comercio_de_hardware_e_servicos_de_tecnologia + 0x885: levolor + 0x886: xsens_technologies + 0x887: hydro_gear_limited_partnership + 0x888: en_pointe_fencing + 0x889: xanthio + 0x88a: sclak + 0x88b: tricorder_arraay_technologies + 0x88c: gb_solution + 0x88d: soliton_systems_k_k + 0x88e: giga_tms + 0x88f: tait_international + 0x890: nichiei_intec + 0x891: smart_wireless + 0x892: ingenieurbuero_birnfeld_ug_haftungsbeschraenkt + 0x893: maytronics + 0x894: epifit + 0x895: gimer_medical + 0x896: nokian_renkaat + 0x897: current_lighting_solutions + 0x898: sensibo + 0x899: sfs_unimarket + 0x89a: private_limited_company_teltonika + 0x89b: saucon_technologies + 0x89c: embedded_devices + 0x89d: j_j_a_d_e_enterprise + 0x89e: i_sens + 0x89f: witschi_electronic + 0x8a0: aclara_technologies + 0x8a1: exeo_tech + 0x8a2: epic_systems + 0x8a3: hoffmann + 0x8a4: realme_chongqing_mobile_telecommunications + 0x8a5: umeheal + 0x8a6: intelligenceworks + 0x8a7: tgr_1_618 + 0x8a8: shanghai_kfcube + 0x8a9: fraunhofer_iis + 0x8aa: sz_dji_technology + 0x8ab: coburn_technology + 0x8ac: topre + 0x8ad: kayamatics + 0x8ae: moticon_re_go + 0x8af: polidea + 0x8b0: trivedi_advanced_technologies + 0x8b1: core_vision + 0x8b2: pf_schweisstechnologie + 0x8b3: ioniq_skincare + 0x8b4: sengled + 0x8b5: transfer_fi + 0x8b6: boehringer_ingelheim_vetmedica + 0x8b7: abb_8b7 + 0x8b8: check_technology_solutions + 0x8b9: u_shin + 0x8ba: hyper_ice + 0x8bb: tokai_rika + 0x8bc: prevayl + 0x8bd: bf1systems + 0x8be: ubisys_technologies + 0x8bf: sirc + 0x8c0: accent_advanced_systems_slu + 0x8c1: rayden_earth + 0x8c2: lindinvent + 0x8c3: chipolo + 0x8c4: cell_assist + 0x8c5: j_wagner + 0x8c6: integra_optics + 0x8c7: monadnock_systems + 0x8c8: liteboxer_technologies + 0x8c9: noventa + 0x8ca: nubia_technology + 0x8cb: jt_innovations + 0x8cc: tgm_technology + 0x8cd: ifly + 0x8ce: zimi + 0x8cf: betternotstealmybike_ug_with_limited_liability + 0x8d0: estom_infotech + 0x8d1: sensovium + 0x8d2: virscient + 0x8d3: novel_bits + 0x8d4: adata_technology + 0x8d5: ke_yes + 0x8d6: nome + 0x8d7: inovonics_8d7 + 0x8d8: wares + 0x8d9: pointr_labs + 0x8da: miridia_technology + 0x8db: tertium_technology + 0x8dc: shenzhen_aukey_e_business + 0x8dd: code_q + 0x8de: tyco_electronics_corporation_a_te_connectivity + 0x8df: iris_ohyama + 0x8e0: philia_technology + 0x8e1: kozo_keikaku_engineering + 0x8e2: shenzhen_simo_technology + 0x8e3: republic_wireless + 0x8e4: rashidov + 0x8e5: crowd_connected + 0x8e6: eneso_tecnologia_de_adaptacion + 0x8e7: barrot_technology + 0x8e8: naonext + 0x8e9: taiwan_intelligent_home + 0x8ea: cowbell_engineering + 0x8eb: beijing_big_moment_technology + 0x8ec: denso + 0x8ed: imi_hydronic_engineering_international + 0x8ee: askey + 0x8ef: cumulus_digital_systems + 0x8f0: joovv + 0x8f1: the_l_s_starrett + 0x8f2: microoled + 0x8f3: psp_pauli_services_products + 0x8f4: kodimo_technologies + 0x8f5: tymtix_technologies + 0x8f6: dermal_photonics + 0x8f7: mtd_products_inc_affiliates + 0x8f8: instagrid + 0x8f9: spacelabs_medical + 0x8fa: troo + 0x8fb: darkglass_electronics + 0x8fc: hill_rom + 0x8fd: bio_intelli_sense + 0x8fe: ketronixs + 0x8ff: plastimold_products + 0x900: beijing_zizai_technology + 0x901: lucimed + 0x902: tsc_auto_id_technology + 0x903: datamars + 0x904: suncorporation + 0x905: yandex_services + 0x906: scope_logistical_solutions + 0x907: user_hello + 0x908: pinpoint_innovations + 0x909: zero_point_zero_two_seven_zeromai + 0x90a: zhuhai_hoksi_technology + 0x90b: embr_labs + 0x90c: radiawave_technologies + 0x90d: iot_invent + 0x90e: optimusiot_tech + 0x90f: vc + 0x910: asr_microelectronics_shanghai + 0x911: douglas_lighting_controls + 0x912: nerbio_medical_software_platforms + 0x913: braveheart_wireless + 0x914: ineo_sense + 0x915: honda_motor + 0x916: ambient_sensors + 0x917: asr_microelectronics_shen_zhen + 0x918: technosphere_labs + 0x919: no_smd + 0x91a: albertronic + 0x91b: luminostics + 0x91c: oblamatik + 0x91d: innokind + 0x91e: melbot_studios_sociedad_limitada + 0x91f: myzee_technology + 0x920: omnisense + 0x921: kaha + 0x922: shanghai_mxchip_information_technology + 0x923: jsb_tech + 0x924: fundacion_tecnalia_research_and_innovation + 0x925: yukai_engineering + 0x926: gooligum_technologies + 0x927: rooq + 0x928: ai_rista + 0x929: qingdao_haier_technology + 0x92a: sappl_verwaltungs_und_betriebs + 0x92b: tek_home + 0x92c: pci + 0x92d: leggett_platt + 0x92e: ps + 0x92f: c_o_b_o + 0x930: james_walker_rota_bolt + 0x931: breathings + 0x932: bar_vision + 0x933: sram + 0x934: kite_spring + 0x935: reconnect + 0x936: elekon + 0x937: real_thingks + 0x938: henway_technologies + 0x939: astem + 0x93a: linked_semi_microelectronics_xiamen + 0x93b: enseso + 0x93c: xenoma + 0x93d: adolf_wuerth + 0x93e: catalyft_labs + 0x93f: jepico + 0x940: hero_workout + 0x941: rivian_automotive + 0x942: transsion_holdings + 0x943: inovonics_943 + 0x944: agitron + 0x945: globe_jiangsu + 0x946: amc_international_alfa_metalcraft + 0x947: first_light_technologies + 0x948: wearable_link + 0x949: metronom_health_europe + 0x94a: zwift + 0x94b: kindeva_drug_delivery_l_p + 0x94c: gimmi_sys + 0x94d: tk_labs + 0x94e: passive_bolt + 0x94f: limited_liability_company_mikrotikls + 0x950: capetech + 0x951: pprs + 0x952: apptricity + 0x953: logi_lube_953 + 0x954: julbo + 0x955: breville + 0x956: kerlink + 0x957: ohsung_electronics + 0x958: zte + 0x959: herd_dogg + 0x95a: selekt_bilgisayar_lletisim_urunleri_lnsaat_sanayi_ve_ticaret_limited_sirketi + 0x95b: lismore_instruments + 0x95c: logi_lube_95c + 0x95d: etc + 0x95e: bio_echo_net + 0x95f: nuance_hearing + 0x960: sena_technologies + 0x961: linkura + 0x962: gl_solutions_k_k + 0x963: moonbird + 0x964: countrymate_technology + 0x965: asahi_kasei + 0x966: point_guard + 0x967: neo_materials_and_consulting + 0x968: actev_motors + 0x969: woan_technology_shenzhen + 0x96a: dricos + 0x96b: guide_id + 0x96c: zero_point_zero_four_nine_three_seven_four_7319_quebec + 0x96d: gunwerks + 0x96e: band_industries + 0x96f: lund_motion_products + 0x970: iba_dosimetry + 0x971: ga + 0x972: closed_joint_stock_company_zavod_flometr_zavod_flometr_cjsc + 0x973: popit + 0x974: abeye + 0x975: blue_iot_beijing_technology + 0x976: fauna_audio + 0x977: toyota_motor + 0x978: ziffer_eins + 0x979: biotronik + 0x97a: core + 0x97b: ctek_sweden + 0x97c: thorley_industries + 0x97d: clb + 0x97e: sonic_sensory + 0x97f: isemar + 0x980: dekra_testing_and_certification_s_a_u + 0x981: bernard_krone_holding + 0x982: elpro_buchs + 0x983: feedback_sports + 0x984: tera_tron + 0x985: lumos_health + 0x986: cello_hill + 0x987: tse_brakes + 0x988: bhm_tech_produktionsgesellschaft_m_b_h + 0x989: wika_alexander_wiegand + 0x98a: biovigil + 0x98b: mequonic_engineering + 0x98c: b_grid + 0x98d: c3_wireless + 0x98e: adveez + 0x98f: aktiebolaget_regin + 0x990: anton_paar + 0x991: telenor + 0x992: big_kaiser_precision_tooling + 0x993: absolute_audio_labs + 0x994: vt42 + 0x995: bronkhorst_high_tech + 0x996: c_e_fein + 0x997: next_mind + 0x998: pixie_dust_technologies + 0x999: e_tactica_ehf + 0x99a: new_audio + 0x99b: sendum_wireless + 0x99c: deister_electronic + 0x99d: ykk_ap + 0x99e: step_one + 0x99f: koya_medical + 0x9a0: pine_trees_health + 0x9a1: vos_systems + 0x9a2: engagenow_data_sciences + 0x9a3: arduino + 0x9a4: kumho_electrics + 0x9a5: security_enhancement_systems + 0x9a6: beijing_electric_vehicle + 0x9a7: paybuddy + 0x9a8: khn_solutions + 0x9a9: nippon_ceramic + 0x9aa: photodynamic + 0x9ab: dash_logic + 0x9ac: ambiq + 0x9ad: narhwall + 0x9ae: pozyx + 0x9af: if_link_open_community + 0x9b0: deublin + 0x9b1: blinqy + 0x9b2: dyphi + 0x9b3: blue_x_microelectronics + 0x9b4: penta_lock + 0x9b5: autec_gesellschaft_fuer_automationstechnik_mb_h + 0x9b6: pegasus_technologies + 0x9b7: bout_labs + 0x9b8: player_data + 0x9b9: savoy_electronic_lighting + 0x9ba: elimo_engineering + 0x9bb: sky_stream + 0x9bc: aerosens + 0x9bd: centre_suisse_d_electronique_et_de_microtechnique + 0x9be: vessel + 0x9bf: span_io + 0x9c0: another_brain + 0x9c1: rosewill + 0x9c2: universal_audio + 0x9c3: japan_tobacco + 0x9c4: uvisio + 0x9c5: hung_yi_microelectronics + 0x9c6: honor_device + 0x9c7: combustion + 0x9c8: xuntong + 0x9c9: crowd_glow + 0x9ca: mobitrace + 0x9cb: hx_engineering + 0x9cc: senso4s + 0x9cd: blyott + 0x9ce: julius_blum + 0x9cf: blue_streak_io_t + 0x9d0: chess_wise + 0x9d1: ablepay_technologies + 0x9d2: temperature_sensitive_solutions_systems_sweden + 0x9d3: heart_hero + 0x9d4: orbis + 0x9d5: gear_radio_electronics + 0x9d6: ear_teknik_isitme_ve_odiometri_cihazlari_sanayi_ve_ticaret_anonim_sirketi + 0x9d7: coyotta + 0x9d8: synergy_tecnologia_em_sistemas + 0x9d9: vivo_sens_medical + 0x9da: nagravision + 0x9db: bionic_avionics + 0x9dc: aon2 + 0x9dd: innoware_development + 0x9de: jld_technology_solutions + 0x9df: magnus_technology + 0x9e0: preddio_technologies + 0x9e1: tag_n_trac + 0x9e2: wuhan_linptech + 0x9e3: friday_home + 0x9e4: cps + 0x9e5: mobilogix + 0x9e6: masonite + 0x9e7: kabushikigaisha_haneron + 0x9e8: melange_systems + 0x9e9: lumen_radio + 0x9ea: athlos + 0x9eb: kean_electronics + 0x9ec: yukon_advanced_optics_worldwide + 0x9ed: sibel + 0x9ee: ojmar + 0x9ef: steinel_solutions + 0x9f0: watch_gas + 0x9f1: om_digital_solutions + 0x9f2: audeara + 0x9f3: beijing_zero_zero_infinity_technology diff --git a/hardware/bluetooth/control/bluetooth_control_command.ksy b/hardware/bluetooth/control/bluetooth_control_command.ksy new file mode 100644 index 000000000..67dfdc66d --- /dev/null +++ b/hardware/bluetooth/control/bluetooth_control_command.ksy @@ -0,0 +1,40 @@ +meta: + id: bluetooth_control_command + title: Bluetooth Host Controller Interface Control Protocol + license: Unlicense + endian: le + bit-endian: le + imports: + - vendor_specific/bluetooth_control_group_vendor_specific + - ../bluetooth_vendors_ids +doc: | + Bluetooth HCI control command. Used for the stuff like managing bluetooth settings and loading firmware. +doc-ref: https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=478726 +params: + - id: vendor + type: u2 + enum: bluetooth_vendors_ids::vendor +seq: + - id: opcode + type: opcode + - id: size + type: u1 + - id: parameters + size: size + type: + switch-on: opcode.group + cases: + "group::vendor_specific": bluetooth_control_group_vendor_specific(vendor, opcode.command) +types: + opcode: + seq: + - id: command + -orig-id: OpCode Command Field + type: b10 + - id: group + -orig-id: OpCode Group Field + type: b6 + enum: group +enums: + group: + 0x3f: vendor_specific diff --git a/hardware/bluetooth/control/vendor_specific/bluetooth_control_group_vendor_specific.ksy b/hardware/bluetooth/control/vendor_specific/bluetooth_control_group_vendor_specific.ksy new file mode 100644 index 000000000..d38c6e063 --- /dev/null +++ b/hardware/bluetooth/control/vendor_specific/bluetooth_control_group_vendor_specific.ksy @@ -0,0 +1,21 @@ +meta: + id: bluetooth_control_group_vendor_specific + title: Vendor-specific HCI commands + license: Unlicense + endian: le + imports: + - ../../bluetooth_vendors_ids + - cypress_semiconductor/bluetooth_control_group_vendor_specific_cypress +params: + - id: vendor + type: u2 + enum: bluetooth_vendors_ids::vendor + - id: command + type: u2 # should be u10, bit-sized types don't work in WebIDE +seq: + - id: payload + size-eos: true + type: + switch-on: vendor + cases: + bluetooth_vendors_ids::vendor::cypress_semiconductor: bluetooth_control_group_vendor_specific_cypress(command) diff --git a/hardware/bluetooth/control/vendor_specific/cypress_semiconductor/bluetooth_control_group_vendor_specific_cypress.ksy b/hardware/bluetooth/control/vendor_specific/cypress_semiconductor/bluetooth_control_group_vendor_specific_cypress.ksy new file mode 100644 index 000000000..c5b0c0abc --- /dev/null +++ b/hardware/bluetooth/control/vendor_specific/cypress_semiconductor/bluetooth_control_group_vendor_specific_cypress.ksy @@ -0,0 +1,349 @@ +meta: + id: bluetooth_control_group_vendor_specific_cypress + title: Cypress vendor-specific HCI control commands + license: MIT + endian: le + xref: + wikidata: Q478354 +doc: | + Vendor-specific Cypress commands. Mostly reverse-engineered by internalblue project. + +doc-ref: + - https://raw.githubusercontent.com/seemoo-lab/internalblue/master/doc/internalblue_thesis_dennis_mantz.pdf + - https://github.com/seemoo-lab/internalblue/blob/master/internalblue/hci.py + - https://www.cypress.com/file/352891/download + - https://digitalcommons.wpi.edu/cgi/viewcontent.cgi?article=2364&context=etd-theses +params: + - id: command_num_v + type: u2 # should be u10, bit-sized types don't work in WebIDE +seq: + - id: payload + type: + switch-on: command + cases: + #'command::download_minidriver': download_minidriver # no args + #'command::update_baudrate': update_baudrate # TODO + #'command::write_uart_clock_setting': write_uart_clock_setting # TODO + 'command::write_ram': write_ram + 'command::read_ram': read_ram + 'command::launch_ram': launch_ram +instances: + command: + value: command_num_v + enum: command +types: + read_ram: + doc: | + is a command which reads up to 251 bytes of memory from the chips address space and sends it back to the host in the HCI command complete event. Contrary to its name, this command is also able to read the ROM. Any attempt to read unmapped addresses or beyond the end of a memory section causes the chip to crash. + seq: + - id: address + type: u2 + - id: size + type: u8 + write_ram: + doc: | + is the counterpart of the Read_RAM command which can be used to write up to 251 bytes to the RAM regions of the chips memory. If attempting to write to a ROM section, the command has no effect. However, trying to write to an unmapped address causes the system to crash. + seq: + - id: address + type: u2 + - id: data + size-eos: true + launch_ram: + doc: | + can be used to continue code execution on the chip at a specified address using Thumb mode. One of the intended use cases is to exit the Download_Minidriver mode by specifying the pseudo-address 0xFFFFFFFF which will issue the chip to reboot into Bluetooth mode and apply the downloaded patches. Another use case is to jump to the entry point of a so-called Minidriver which was previously loaded into RAM using the Download_Minidriver and Write_RAM commands. + seq: + - id: entry_point + type: u2 +enums: + command: + # for el in HCI_COMND: + # cmdNo = hex(el & 0x3FF) + # isVendorSpecific = (int(el) >> 10) == 0x3f + # if isVendorSpecific: + # print(cmdNo + ":", inflection.underscore(el.name)) + + 0x000: customer_extension + 0x001: write_bd_addr + 0x002: dump_sram + 0x003: channel_class_config + 0x004: read_page_scan_repetition_mode + 0x005: write_page_scan_repetition_mode + 0x006: read_page_response_timeout + 0x007: write_page_response_timeout + 0x008: bt_link_quality_mode + 0x009: write_new_connection_timeout + 0x00a: super_peek_poke + 0x00b: write_local_supported_features + 0x00c: super_duper_peek_poke + 0x00d: rssi_history + 0x00e: set_led_global_ctrl + 0x00f: force_hold_mode + 0x010: commit_bd_addr + 0x012: write_hopping_channels + 0x013: sleep_forever_mode + 0x014: set_carrier_frequency_arm + 0x016: set_encryption_key_size + 0x017: invalidate_flash_and_reboot + 0x018: update_uart_baud_rate # set the baud rate of the uart interface of the controller + 0x019: gpio_config_and_write + 0x01a: gpio_read + 0x01b: set_test_mode_type + 0x01c: write_sco_pcm_interface_param + 0x01d: read_sco_pcm_int_param + 0x01e: write_pcm_data_format_param + 0x01f: read_pcm_data_format_param + 0x020: write_comfort_noise_param + 0x022: write_sco_time_slot + 0x023: read_sco_time_slot + 0x024: write_pcm_loopback_moded + 0x025: read_pcm_loopback_moded + 0x026: set_transmit_power + 0x027: set_sleep_mode + 0x028: read_sleep_mode + 0x029: sleepmode_command + 0x02a: handle_delay_peripheral_sco_startup + 0x02b: write_receive_only + 0x02d: rf_config_settings + 0x02e: + id: download_minidriver + doc: | + Set the chip into a state where it can receive patches + will put the device into a special mode in which it is safe to receive patches. In this mode the normal Bluetooth activity is disabled. Only a very reduced subset of HCI commands are interpreted in the download mode, including Read_RAM, Write_RAM and Launch_RAM. The latter is being used to to exit the download mode and reboot into the normal Bluetooth firmware. Any downloaded ROM patches are applied at an early stage during this reboot. The Download_Minidriver command takes no arguments. + 0x02f: crystal_ppm + 0x032: set_afh_behavior + 0x033: read_btw_security_key + 0x034: enable_radio + 0x035: cosim_set_mode + 0x036: get_hid_device_list + 0x037: add_hid_device + 0x039: remove_hid_device + 0x03a: enable_tca + 0x03b: enable_usb_hid_emulation + 0x03c: write_rf_programming_table + 0x040: read_collaboration_mode + 0x041: write_collaboration_mode + 0x043: write_rf_attenuation_table + 0x044: read_uart_clock_setting + 0x045: + id: write_uart_clock_setting + doc: "Change the UART clock (24 MHz or 48 MHz)" + 0x046: set_sleep_clock_accuraty_and_settling_time + 0x047: configure_sleep_mode + 0x048: read_raw_rssi + 0x04c: + id: write_ram + doc: Write data to the RAM of the chip + 0x04d: + id: read_ram + doc: Read data from the RAM of the chip + 0x04e: + id: launch_ram + doc: Leave the Download_Minidriver state and reboot to apply the patches + 0x04f: install_patches + 0x051: radio_tx_test + 0x052: radio_rx_test + 0x054: dut_loopback_test + 0x056: enhanced_radio_rx_test + 0x057: write_high_priority_connection + 0x058: send_lmp_pdu + 0x059: port_information_enable + 0x05a: read_bt_port_pid_vid + 0x05b: read2_m_bit_flash_crc + 0x05c: factory_commit_production_test_flag + 0x05d: read_production_test_flag + 0x05e: write_pcm_mute_param + 0x05f: read_pcm_mute_param + 0x061: write_pcm_pins + 0x062: read_pcm_pins + 0x06d: write_i2s_pcm_interface + 0x06e: read_controller_features + 0x071: write_ram_compressed + 0x078: calculate_crc + 0x079: read_verbose_config_version_info + 0x07a: transport_suspend + 0x07b: transport_resume + 0x07c: baseband_flow_control_override + 0x07d: write_class15_power_table + 0x07e: enable_wbs + 0x07f: write_vad_mode + 0x080: read_vad_mode + 0x081: write_ecsi_config + 0x082: fm_tx_command + 0x083: write_dynamic_sco_routing_change + 0x084: read_hid_bit_error_rate + 0x085: enable_hci_remote_test + 0x08a: calibrate_bandgap + 0x08b: uipc_over_hci + 0x08c: read_adc_channel + 0x090: coex_bandwidth_statistics + 0x091: read_pmu_config_flags + 0x092: write_pmu_config_flags + 0x093: aruba_ctrl_main_status_mon + 0x094: control_afh_acl_setup + 0x095: aruba_read_write_init_param + 0x096: internal_capacitor_tuning + 0x097: bfc_disconnect + 0x098: bfc_send_data + 0x09a: coex_write_wimax_configuration + 0x09b: bfc_polling_enable + 0x09c: bfc_reconnectable_device + 0x09d: conditional_scan_configuration + 0x09e: packet_error_injection + 0x0a0: write_rf_reprogramming_table_masking + 0x0a1: blpm_enable + 0x0a2: read_audio_route_info + 0x0a3: encapsulated_hci_command + 0x0a4: send_epc_lmp_message + 0x0a5: transport_statistics + 0x0a6: bist_post_get_results + 0x0ad: current_sensor_ctrler_config + 0x0ae: pcm2_setup + 0x0af: read_boot_crystal_status + 0x0b2: sniff_subrating_maximum_local_latency + 0x0b4: set_plc_on_off + 0x0b5: bfc_suspend + 0x0b6: bfc_resume + 0x0b7: three_d_tv2_tv_sync_and_reporting + 0x0b8: write_otp + 0x0b9: read_otp + 0x0ba: le_read_random_address + 0x0bb: le_hw_setup + 0x0bc: le_dvt_txrxtest + 0x0bd: le_dvt_testdatapkt + 0x0be: le_dvt_log_setup + 0x0bf: le_dvt_errorinject_scheme + 0x0c0: le_dvt_timing_scheme + 0x0c1: le_scan_rssi_threshold_setup + 0x0c2: bfc_set_parameters + 0x0c3: bfc_read_parameters + 0x0c4: turn_off_dynamic_power_control + 0x0c5: increase_decrease_power_level + 0x0c6: read_raw_rssi_value + 0x0c7: set_proximity_table + 0x0c8: set_proximity_trigger + 0x0cd: set_sub_sniff_interval + 0x0ce: enable_repeater_functionality + 0x0cf: update_config_item + 0x0d0: bfc_create_connection + 0x0d1: wbs_bec_params + 0x0d2: read_golden_range + 0x0d3: initiate_multicast_beacon_lock + 0x0d4: terminate_multicast + 0x0d7: enable_h4_ibss + 0x0d8: bluebridge_spi_negotiation_request + 0x0d9: bluebridge_spi_sleepthreshold_request + 0x0da: accessory_protocol_command_group + 0x0db: handle_write_otp_aux_data + 0x0dc: init_mcast_ind_poll + 0x0dd: enter_mcast_ind_poll + 0x0de: disconnect_mcast_ind_poll + 0x0e0: extended_inquiry_handshake + 0x0e1: uartbridge_route_hci_cmd_to_uart_bridge + 0x0e2: olympic + 0x0e4: config_hid_lhl_gpio + 0x0e5: read_hid_lhl_gpio + 0x0e6: le_tx_test + 0x0e7: uartbridge_set_uart_bridge_parameter + 0x0e8: bist_ber + 0x0e9: handle_le_meta_vsc1 + 0x0ea: bfc_set_priority + 0x0eb: bfc_read_priority + 0x0ec: ant_command + 0x0ed: link_quality_stats + 0x0ee: read_native_clock + 0x0ef: bfc_set_wakeup_flags + 0x0f2: start_dvt_tinydriver + 0x0f4: set_3_dtv_dual_mode_view + 0x0f5: bfc_read_remoe_bpcs_features + 0x0f7: ignore_usb_reset + 0x0f8: sniff_reconnect_train + 0x0f9: audio_ip_command + 0x0fa: bfc_write_scan_enable + 0x0fe: read_local_firmware_info + 0x0ff: rssi_measurements + 0x101: bfc_read_scan_enable + 0x102: enable_wbs_modified + 0x103: set_vs_event_mask + 0x104: bfc_is_connection_tbfc_suspended + 0x105: set_usb_auto_resume + 0x106: set_direction_finding_parameters + 0x108: change_lna_gain_coex_eci + 0x10c: lte_link_quality_mode + 0x10d: lte_trigger_wci2_message + 0x10e: lte_enable_wci2_messages + 0x10f: lte_enable_wci2_loopback_testing + 0x110: sco_diag_stat + 0x111: set_streaming_connectionless_broadcast + 0x112: receive_streaming_connectonless_broadcast + 0x113: write_connectionless_broadcast_streaming_data + 0x114: flush_streaming_connectionless_broadcast_data + 0x115: factory_cal_set_tx_power + 0x116: factory_cal_trim_tx_power + 0x117: factory_cal_read_temp_settings + 0x118: factory_cal_update_table_settings + 0x11a: write_a2_dp_connection + 0x11b: factory_cal_read_table_settings + 0x11c: dbfw + 0x11d: factory_calibration_rx_rssi_test + 0x11f: lte_coex_timing_advance + 0x123: handle_le_meta_vsc2 + 0x128: write_local_supported_extended_features + 0x129: piconet_clock_adjustment + 0x12a: read_retransmission_status + 0x12f: set_transmit_power_range + 0x133: page_inquiry_tx_suppression + 0x135: randomize_native_clock + 0x136: store_factory_calibration_data + 0x13b: read_supported_vs_cs + 0x13c: le_write_local_supported_features + 0x13e: le_read_remote_supported_brcm_features + 0x140: bcs_timeline + 0x141: bcs_timeline_broadcast_receive + 0x142: read_dynamic_memory_pool_statistics + 0x143: handle_iop3dtv_tester_config + 0x145: handle_adc_capture + 0x147: le_extended_duplicate_filter + 0x148: le_create_extended_advertising_instance + 0x149: le_remove_extended_advertising_instance + 0x14a: le_set_extended_advertising_parameters + 0x14b: le_set_extended_advertising_data + 0x14c: le_set_extended_scan_response_data + 0x14d: le_set_extended_advertising_enable + 0x14e: le_update_extended_advertising_instance + 0x153: le_get_android_vendor_capabilities + 0x154: le_multi_advt_command + 0x155: le_rpa_offload + 0x156: le_batch_scan_command + 0x157: le_brcm_pcf + 0x159: get_controller_activity_energy_info + 0x15a: extended_set_scan_parameters + 0x15b: getdebuginfo + 0x15c: write_local_host_state + 0x16e: handle_configure_sleep_lines + 0x171: set_special_sniff_transition_enable + 0x173: enable_bt_sync + 0x179: hciulp_handle_btble_high_power_control + 0x17c: handle_customer_enable_ha_link_commands + 0x17d: dwp_test_commands + 0x17f: olympic_lte_settings + 0x182: write_le_remote_public_address + 0x186: one_second_timer_commands + 0x188: force_wlan_channel + 0x18b: svt_config_setup + 0x18f: handle_customer_read_ha_delta_commands + 0x19a: setup_rss_commands + 0x19c: setup_rss_local_commands + 0x1a1: audio_buffer_commands + 0x1a4: health_status_report + 0x1a8: change_connection_priority + 0x1aa: sam_setup_command + 0x1ab: bthci_cmd_ble_enhanced_transmitter_test_hopping + 0x1af: handle_coex_debug_counters + 0x1bb: read_inquiry_transmit_power + 0x1be: enable_padgc_override + 0x1cb: write_tx_power_afh_mode + 0x1cd: set_minimum_number_of_used_channels + 0x1ce: handle_br_edr_link_quality_stats + 0x35e: sector_erase + 0x3ce: chip_erase + 0x3ed: enter_download_mode diff --git a/hardware/bluetooth/updateVendorIds.py b/hardware/bluetooth/updateVendorIds.py new file mode 100644 index 000000000..5f3fece72 --- /dev/null +++ b/hardware/bluetooth/updateVendorIds.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 + +__license__ = "Unlicense" + +import typing +import keyword +import re +import unicodedata +from collections import defaultdict +from pathlib import Path + +import bs4 +import httpx +import inflect +import inflection +import ruamel.yaml + +VENDORS_IDS_SOURCE_URI = "https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers/" +VENDORS_IDS_KSY_FILE_NAME = "bluetooth_vendors_ids.ksy" +VENDORS_IDS_CACHE_FILE_NAME = "company-identifiers.html" + +yaml = ruamel.yaml.YAML() +yaml.indent(mapping=2, sequence=4, offset=2) + +inflEng = inflect.engine() + + +def findPredecessor(node: bs4.element.Tag, predicate: typing.Callable) -> bs4.element.Tag: + n = node + while not predicate(n): + if not n: + raise KeyError("Matching predecessor found") + n = n.parent + return n + + +def locateTableAndExtractHead(doc: bs4.BeautifulSoup) -> typing.Tuple[bs4.element.Tag, typing.Iterable[str]]: + vidTh = next(el for el in doc.select("th") if el.text.strip() == "VendorId") + tableHeadRowNode = findPredecessor(vidTh, lambda n: n.name == "tr") + head = tuple(el.text.strip() for el in tableHeadRowNode.select("th")) + + return findPredecessor(vidTh, lambda n: n.name == "table"), head + + +alphaNumRx = re.compile("[a-zA-Z0-9_ ]+") +chainedUnderscoreRx = re.compile("_+") +leadingDigitsRx = re.compile(r"^(\d+)") +pythonKeywordsList = set(keyword.kwlist) + + +def fixLeadingDigits(s: str) -> str: + return leadingDigitsRx.sub(inflEng.number_to_words, s) + + +def dechainUnderscores(s: str) -> str: + return chainedUnderscoreRx.subn("_", s)[0] + + +def filterNonAlphaNum(s: str) -> str: + return "_".join(alphaNumRx.findall(s)) + + +corpPostfixes = ("gmb_h", "inc", "ltd", "co", "ag", "company", "corporation", "limited", "ab", "llc", "bv", "b_v", "a_s", "group", "s_a", "gmbh", "gmb_h", "kg", "s_r_o", "corp", "z_o_o", "s_r_l", "s_p_a", "srl", "pty", "llp", "ap_s", "sr_l", "sp_a", "s_l", "sas", "asa", "oy", "pte", "private", "sa", "se", "incorporated", "sp", "as", "n_v", "lda", "kft", "bvba", "spol", "spa", "aps", "pvt", "ltda", "snc", "uab", "d_o_o", "sarl", "plc", "nv", "ogh", "ohg", "sl", "oyj", "sdn", "bhd", "and", "ga_a", "hf", "l_imited", "co_k", "s") + + +def depostfixCorpName(s: str) -> str: + postfixFound = 1 + while postfixFound: + postfixFound = 0 + for postfix in corpPostfixes: + if len(s) > len(postfix) + 1 and s[-len(postfix) - 1] == "_" and s[-len(postfix) :] == postfix: + s = s[: -len(postfix) - 1] + postfixFound += 1 + return s + + +def transformCompanyName(s: str) -> str: + s = "".join([c for c in unicodedata.normalize("NFKD", s) if not unicodedata.combining(c)]) + s = inflection.underscore(s).lower() + s = fixLeadingDigits(s) + s = filterNonAlphaNum(s).replace(" ", "_") + s = dechainUnderscores(s) + s = depostfixCorpName(s) + if s[-1] == "_": + s = s[:-1] + if s[0] == "_": + s = s[1:] + if s in pythonKeywordsList: + s += "_" + return s + + +formerlyRx = re.compile("^(?P.+?)\s+\\(?formerly(?:\s+as|:)?\s+(?P[^\\)]+)\\)?$") + + +def parseTable(tableNode: bs4.element.Tag, head: typing.Iterable[str]) -> typing.Iterator[typing.Tuple[str, int]]: + rows = tableNode.select("tr") + for row in rows: + cols = row.select("TD") + if cols: + rowRes = {k: col.text.strip() for k, col in zip(head, cols)} + rowRes["Decimal"] = int(rowRes["Decimal"]) + rowRes["Hexadecimal"] = int(rowRes["Hexadecimal"][2:], 16) + if rowRes["Decimal"] != rowRes["Hexadecimal"]: + print("Problems with ", rowRes, "dec != hex") + + rawName = rowRes["Company"] + m = formerlyRx.match(rawName) + formerName = None + if m: + #formerName = m.group("formerNames").split(" and ") + currentName = m.group("currentName") + else: + currentName = rawName + + yield transformCompanyName(currentName), ruamel.yaml.scalarint.HexInt(rowRes["Hexadecimal"]) + + +def deduplicateAndSwap(maps: typing.Iterable[typing.Tuple[str, int]]) -> typing.Iterable[typing.Tuple[int, str]]: + occurrences = defaultdict(list) + for k, v in maps: + occurrences[k].append(v) + + for k, l in occurrences.items(): + if len(l) == 1: + for v in l: + yield v, k + else: + for v in l: + yield v, k + "_" + hex(v)[2:] + + +def parseVendors(doc: bs4.BeautifulSoup) -> typing.Mapping[int, str]: + table, head = locateTableAndExtractHead(doc) + return ruamel.yaml.comments.CommentedMap(sorted(deduplicateAndSwap(parseTable(table, head)), key=lambda x: x[0])) + + +thisDir = Path(__file__).absolute().parent + + +def genVendorsTable() -> typing.Mapping[int, str]: + cacheFile = Path(thisDir / VENDORS_IDS_CACHE_FILE_NAME) + if not cacheFile.is_file(): + q = httpx.get(VENDORS_IDS_SOURCE_URI, headers={"User-Agent": None}) + data = q.text + del q + cacheFile.write_text(data, encoding="utf-8") + else: + data = cacheFile.read_text(encoding="utf-8") + d = bs4.BeautifulSoup(data, "lxml") + return parseVendors(d) + + +def main() -> None: + vendorsTable = genVendorsTable() + + fileName = thisDir / VENDORS_IDS_KSY_FILE_NAME + with fileName.open("rt", encoding="utf-8") as f: + ksy = yaml.load(f) + + ksy["doc-ref"] = VENDORS_IDS_SOURCE_URI + ksy["enums"]["vendor"] = vendorsTable + + with fileName.open("wt", encoding="utf-8") as f: + yaml.dump(ksy, f) + + +if __name__ == "__main__": + main()