1// Copyright 2018 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <ddk/protocol/serial.h> 8#include <fbl/type_support.h> 9 10namespace ddk { 11namespace internal { 12 13DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_get_info, GetInfo, 14 zx_status_t (C::*)(serial_port_info_t*)); 15 16DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_config, Config, 17 zx_status_t (C::*)(uint32_t, uint32_t)); 18 19DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_enable, Enable, 20 zx_status_t (C::*)(bool)); 21 22DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_read, Read, 23 zx_status_t (C::*)(void*, size_t, size_t*)); 24 25DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_write, Write, 26 zx_status_t (C::*)(const void*, size_t, size_t*)); 27 28DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(serial_has_set_notify_callback, SetNotifyCallback, 29 zx_status_t (C::*)(serial_notify_cb, void*)); 30 31template <typename D> 32constexpr void CheckSerialImplProtocolSubclass() { 33 static_assert(internal::serial_has_get_info<D>::value, 34 "SerialImplProtocol subclasses must implement " 35 "zx_status_t GetInfo(serial_port_info_t* info)"); 36 static_assert(internal::serial_has_config<D>::value, 37 "SerialImplProtocol subclasses must implement " 38 "zx_status_t Config(uint32_t baud_rate, uint32_t flags)"); 39 static_assert(internal::serial_has_enable<D>::value, 40 "SerialImplProtocol subclasses must implement " 41 "zx_status_t Enable(bool enable)"); 42 static_assert(internal::serial_has_read<D>::value, 43 "SerialImplProtocol subclasses must implement " 44 "zx_status_t Read(void* buf, size_t length, size_t* out_actual)"); 45 static_assert(internal::serial_has_write<D>::value, 46 "SerialImplProtocol subclasses must implement " 47 "zx_status_t Write(const void* buf, size_t length, size_t* out_actual)"); 48 static_assert(internal::serial_has_set_notify_callback<D>::value, 49 "SerialImplProtocol subclasses must implement " 50 "zx_status_t SetNotifyCallback(serial_notify_cb cb, void* cookie)"); 51} 52 53} // namespace internal 54} // namespace ddk 55