| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fidl/fuchsia.hardware.platform.bus/cpp/driver/fidl.h> |
| #include <fidl/fuchsia.hardware.platform.bus/cpp/fidl.h> |
| #include <lib/ddk/debug.h> |
| #include <lib/ddk/device.h> |
| #include <lib/ddk/metadata.h> |
| #include <lib/ddk/platform-defs.h> |
| #include <lib/driver/component/cpp/composite_node_spec.h> |
| #include <lib/driver/component/cpp/node_add_args.h> |
| #include <lib/thermal/ntc.h> |
| #include <limits.h> |
| |
| #include <bind/fuchsia/adc/cpp/bind.h> |
| #include <bind/fuchsia/cpp/bind.h> |
| #include <bind/fuchsia/hardware/adc/cpp/bind.h> |
| #include <soc/aml-t931/t931-hw.h> |
| |
| #include "sherlock.h" |
| #include "src/devices/board/drivers/sherlock/sherlock-adc.h" |
| |
| namespace sherlock { |
| namespace fpbus = fuchsia_hardware_platform_bus; |
| |
| zx_status_t Sherlock::ThermistorInit() { |
| thermal::NtcInfo ntc_info[] = { |
| {.part = "ncpXXwf104", |
| .profile = |
| { |
| {.temperature_c = -40, .resistance_ohm = 4397119}, |
| {.temperature_c = -35, .resistance_ohm = 3088599}, |
| {.temperature_c = -30, .resistance_ohm = 2197225}, |
| {.temperature_c = -25, .resistance_ohm = 1581881}, |
| {.temperature_c = -20, .resistance_ohm = 1151037}, |
| {.temperature_c = -15, .resistance_ohm = 846579}, |
| {.temperature_c = -10, .resistance_ohm = 628988}, |
| {.temperature_c = -5, .resistance_ohm = 471632}, |
| {.temperature_c = 0, .resistance_ohm = 357012}, |
| {.temperature_c = 5, .resistance_ohm = 272500}, |
| {.temperature_c = 10, .resistance_ohm = 209710}, |
| {.temperature_c = 15, .resistance_ohm = 162651}, |
| {.temperature_c = 20, .resistance_ohm = 127080}, |
| {.temperature_c = 25, .resistance_ohm = 100000}, |
| {.temperature_c = 30, .resistance_ohm = 79222}, |
| {.temperature_c = 35, .resistance_ohm = 63167}, |
| {.temperature_c = 40, .resistance_ohm = 50677}, |
| {.temperature_c = 45, .resistance_ohm = 40904}, |
| {.temperature_c = 50, .resistance_ohm = 33195}, |
| {.temperature_c = 55, .resistance_ohm = 27091}, |
| {.temperature_c = 60, .resistance_ohm = 22224}, |
| {.temperature_c = 65, .resistance_ohm = 18323}, |
| {.temperature_c = 70, .resistance_ohm = 15184}, |
| {.temperature_c = 75, .resistance_ohm = 12635}, |
| {.temperature_c = 80, .resistance_ohm = 10566}, |
| {.temperature_c = 85, .resistance_ohm = 8873}, |
| {.temperature_c = 90, .resistance_ohm = 7481}, |
| {.temperature_c = 95, .resistance_ohm = 6337}, |
| {.temperature_c = 100, .resistance_ohm = 5384}, |
| {.temperature_c = 105, .resistance_ohm = 4594}, |
| {.temperature_c = 110, .resistance_ohm = 3934}, |
| {.temperature_c = 115, .resistance_ohm = 3380}, |
| {.temperature_c = 120, .resistance_ohm = 2916}, |
| {.temperature_c = 125, .resistance_ohm = 2522}, |
| }}, |
| }; |
| |
| fpbus::Node thermistor; |
| thermistor.name() = "thermistor"; |
| thermistor.vid() = PDEV_VID_GOOGLE; |
| thermistor.did() = PDEV_DID_AMLOGIC_THERMISTOR; |
| |
| thermal::NtcChannel ntc_channels[] = { |
| {.adc_channel = SHERLOCK_THERMISTOR_BASE, |
| .pullup_ohms = 47000, |
| .profile_idx = 0, |
| .name = "therm-base"}, |
| {.adc_channel = SHERLOCK_THERMISTOR_AUDIO, |
| .pullup_ohms = 47000, |
| .profile_idx = 0, |
| .name = "therm-audio"}, |
| {.adc_channel = SHERLOCK_THERMISTOR_AMBIENT, |
| .pullup_ohms = 47000, |
| .profile_idx = 0, |
| .name = "therm-ambient"}, |
| }; |
| |
| std::vector<fpbus::Metadata> therm_metadata{ |
| {{ |
| .type = NTC_CHANNELS_METADATA_PRIVATE, |
| .data = std::vector<uint8_t>( |
| reinterpret_cast<const uint8_t*>(&ntc_channels), |
| reinterpret_cast<const uint8_t*>(&ntc_channels) + sizeof(ntc_channels)), |
| }}, |
| {{ |
| .type = NTC_PROFILE_METADATA_PRIVATE, |
| .data = |
| std::vector<uint8_t>(reinterpret_cast<const uint8_t*>(&ntc_info), |
| reinterpret_cast<const uint8_t*>(&ntc_info) + sizeof(ntc_info)), |
| }}, |
| }; |
| |
| thermistor.pid() = PDEV_PID_SHERLOCK; |
| thermistor.metadata() = std::move(therm_metadata); |
| fidl::Arena<> fidl_arena; |
| fdf::Arena arena('THER'); |
| |
| const std::vector<fuchsia_driver_framework::BindRule> kBaseThermistorCompositeRules = { |
| fdf::MakeAcceptBindRule(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeAcceptBindRule(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_BASE), |
| }; |
| const std::vector<fuchsia_driver_framework::NodeProperty> kBaseThermistorCompositeProperties = { |
| fdf::MakeProperty(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeProperty(bind_fuchsia_adc::FUNCTION, bind_fuchsia_adc::FUNCTION_THERMISTOR), |
| fdf::MakeProperty(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_BASE), |
| }; |
| const std::vector<fuchsia_driver_framework::BindRule> kAudioThermistorCompositeRules = { |
| fdf::MakeAcceptBindRule(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeAcceptBindRule(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_AUDIO), |
| }; |
| const std::vector<fuchsia_driver_framework::NodeProperty> kAudioThermistorCompositeProperties = { |
| fdf::MakeProperty(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeProperty(bind_fuchsia_adc::FUNCTION, bind_fuchsia_adc::FUNCTION_THERMISTOR), |
| fdf::MakeProperty(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_AUDIO), |
| }; |
| const std::vector<fuchsia_driver_framework::BindRule> kAmbientThermistorCompositeRules = { |
| fdf::MakeAcceptBindRule(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeAcceptBindRule(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_AMBIENT), |
| }; |
| const std::vector<fuchsia_driver_framework::NodeProperty> kAmbientThermistorCompositeProperties = |
| { |
| fdf::MakeProperty(bind_fuchsia_hardware_adc::SERVICE, |
| bind_fuchsia_hardware_adc::SERVICE_ZIRCONTRANSPORT), |
| fdf::MakeProperty(bind_fuchsia_adc::FUNCTION, bind_fuchsia_adc::FUNCTION_THERMISTOR), |
| fdf::MakeProperty(bind_fuchsia_adc::CHANNEL, SHERLOCK_THERMISTOR_AMBIENT), |
| }; |
| |
| const std::vector<fuchsia_driver_framework::ParentSpec> kThermistorParents = { |
| fuchsia_driver_framework::ParentSpec{{.bind_rules = kBaseThermistorCompositeRules, |
| .properties = kBaseThermistorCompositeProperties}}, |
| fuchsia_driver_framework::ParentSpec{{.bind_rules = kAudioThermistorCompositeRules, |
| .properties = kAudioThermistorCompositeProperties}}, |
| fuchsia_driver_framework::ParentSpec{{.bind_rules = kAmbientThermistorCompositeRules, |
| .properties = kAmbientThermistorCompositeProperties}}, |
| }; |
| auto result = pbus_.buffer(arena)->AddCompositeNodeSpec( |
| fidl::ToWire(fidl_arena, thermistor), |
| fidl::ToWire(fidl_arena, fuchsia_driver_framework::CompositeNodeSpec{ |
| {.name = "thermistor", .parents = kThermistorParents}})); |
| if (!result.ok()) { |
| zxlogf(ERROR, "%s: NodeAdd Thermistor(thermistor) request failed: %s", __func__, |
| result.FormatDescription().data()); |
| return result.status(); |
| } |
| if (result->is_error()) { |
| zxlogf(ERROR, "%s: NodeAdd Thermistor(thermistor) failed: %s", __func__, |
| zx_status_get_string(result->error_value())); |
| return result->error_value(); |
| } |
| |
| return ZX_OK; |
| } |
| } // namespace sherlock |