| // Copyright 2018 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. |
| |
| #ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_LCD_H_ |
| #define SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_LCD_H_ |
| |
| #include <fidl/fuchsia.hardware.gpio/cpp/wire.h> |
| #include <lib/zx/result.h> |
| |
| #include <cstdint> |
| #include <memory> |
| |
| #include "src/graphics/display/drivers/amlogic-display/panel-config.h" |
| #include "src/graphics/display/lib/designware-dsi/dsi-host-controller.h" |
| #include "src/graphics/display/lib/driver-framework-migration-utils/namespace/namespace.h" |
| |
| namespace amlogic_display { |
| |
| // An Lcd controls the panel attached to a MIPI-DSI endpoint. |
| class Lcd { |
| public: |
| // Factory method intended for production use. |
| // |
| // `panel_config` must not be null and must outlive the `Lcd` instance. |
| // |
| // `designware_dsi_host_controller` must not be null and must outlive the |
| // `Lcd` instance. |
| // |
| // `enabled` is true iff the driver adopts an already initialized panel. |
| // |
| // Creating an Lcd instance doesn't change the hardware state, and is |
| // therefore safe to use when adopting a device previously initialized by |
| // the bootloader or another driver. |
| static zx::result<std::unique_ptr<Lcd>> Create( |
| display::Namespace& incoming, uint32_t panel_type, const PanelConfig* panel_config, |
| designware_dsi::DsiHostController* designware_dsi_host_controller, bool enabled); |
| |
| // Production code should prefer using the `Create()` factory method. |
| // |
| // `panel_config` must not be null and must outlive the `Lcd` instance. |
| // |
| // `designware_dsi_host_controller` must not be null and must outlive the |
| // `Lcd` instance. |
| // |
| // `lcd_reset_gpio` must be a valid GPIO pin. |
| explicit Lcd(uint32_t panel_type, const PanelConfig* panel_config, |
| designware_dsi::DsiHostController* designware_dsi_host_controller, |
| fidl::ClientEnd<fuchsia_hardware_gpio::Gpio> lcd_reset_gpio, bool enabled); |
| |
| Lcd(const Lcd&) = delete; |
| Lcd& operator=(const Lcd&) = delete; |
| |
| // Turn the panel on |
| zx::result<> Enable(); |
| |
| // Turn the panel off |
| zx::result<> Disable(); |
| |
| private: |
| // Decodes and performs the Amlogic-specific display initialization command |
| // sequence stored in `encoded_commands` which is a packed buffer of all |
| // encoded commands. |
| // |
| // The Amlogic-specific display initialization commands are defined in: |
| // Amlogic MIPI DSI Panel Tuning User Guide, Version 0.1 (Google internal), |
| // Section 3.2.6 "Init table config", page 19. |
| zx::result<> PerformDisplayInitCommandSequence(cpp20::span<const uint8_t> encoded_commands); |
| |
| uint32_t panel_type_; |
| const PanelConfig& panel_config_; |
| |
| designware_dsi::DsiHostController& designware_dsi_host_controller_; |
| fidl::WireSyncClient<fuchsia_hardware_gpio::Gpio> lcd_reset_gpio_; |
| |
| bool enabled_ = false; |
| }; |
| |
| } // namespace amlogic_display |
| |
| #endif // SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_LCD_H_ |