13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright (c) 2022 FuZhou Lockzhiner Electronic Co., Ltd. All rights reserved. 33d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 53d0407baSopenharmony_ci * You may obtain a copy of the License at 63d0407baSopenharmony_ci * 73d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83d0407baSopenharmony_ci * 93d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123d0407baSopenharmony_ci * See the License for the specific language governing permissions and 133d0407baSopenharmony_ci * limitations under the License. 143d0407baSopenharmony_ci */ 153d0407baSopenharmony_ci#include <stdio.h> 163d0407baSopenharmony_ci#include <stdint.h> 173d0407baSopenharmony_ci#include <stdlib.h> 183d0407baSopenharmony_ci 193d0407baSopenharmony_ci#include "hdf_device_desc.h" 203d0407baSopenharmony_ci#include "device_resource_if.h" 213d0407baSopenharmony_ci#include "hdf_log.h" 223d0407baSopenharmony_ci#include "osal_mem.h" 233d0407baSopenharmony_ci#include "spi_core.h" 243d0407baSopenharmony_ci#include "spi_if.h" 253d0407baSopenharmony_ci 263d0407baSopenharmony_ci#include "lz_hardware.h" 273d0407baSopenharmony_ci 283d0407baSopenharmony_ci#define PRINT_ERR(fmt, args...) do { \ 293d0407baSopenharmony_ci printf("%s, %d, error: "fmt, __func__, __LINE__, ##args); \ 303d0407baSopenharmony_ci} while (0) 313d0407baSopenharmony_ci 323d0407baSopenharmony_ci#define PRINT_WARR(fmt, args...) do { \ 333d0407baSopenharmony_ci if (1) printf("%s, %d, warr: "fmt, __func__, __LINE__, ##args); \ 343d0407baSopenharmony_ci} while (0) 353d0407baSopenharmony_ci 363d0407baSopenharmony_ci#define PRINT_LOG(fmt, args...) do { \ 373d0407baSopenharmony_ci if (1) printf("%s, %d, log: "fmt, __func__, __LINE__, ##args); \ 383d0407baSopenharmony_ci} while (0) 393d0407baSopenharmony_ci 403d0407baSopenharmony_cistruct spi_params { 413d0407baSopenharmony_ci uint32_t bus; 423d0407baSopenharmony_ci uint32_t id; 433d0407baSopenharmony_ci uint32_t func_mode; 443d0407baSopenharmony_ci uint32_t cs_gpio; 453d0407baSopenharmony_ci uint32_t cs_func; 463d0407baSopenharmony_ci uint32_t cs_type; 473d0407baSopenharmony_ci uint32_t cs_drv; 483d0407baSopenharmony_ci uint32_t cs_dir; 493d0407baSopenharmony_ci uint32_t cs_val; 503d0407baSopenharmony_ci uint32_t clk_gpio; 513d0407baSopenharmony_ci uint32_t clk_func; 523d0407baSopenharmony_ci uint32_t clk_type; 533d0407baSopenharmony_ci uint32_t clk_drv; 543d0407baSopenharmony_ci uint32_t clk_dir; 553d0407baSopenharmony_ci uint32_t clk_val; 563d0407baSopenharmony_ci uint32_t mosi_gpio; 573d0407baSopenharmony_ci uint32_t mosi_func; 583d0407baSopenharmony_ci uint32_t mosi_type; 593d0407baSopenharmony_ci uint32_t mosi_drv; 603d0407baSopenharmony_ci uint32_t mosi_dir; 613d0407baSopenharmony_ci uint32_t mosi_val; 623d0407baSopenharmony_ci uint32_t miso_gpio; 633d0407baSopenharmony_ci uint32_t miso_func; 643d0407baSopenharmony_ci uint32_t miso_type; 653d0407baSopenharmony_ci uint32_t miso_drv; 663d0407baSopenharmony_ci uint32_t miso_dir; 673d0407baSopenharmony_ci uint32_t miso_val; 683d0407baSopenharmony_ci uint32_t bitsPerWord; 693d0407baSopenharmony_ci uint32_t firstBit; 703d0407baSopenharmony_ci uint32_t mode; 713d0407baSopenharmony_ci uint32_t csm; 723d0407baSopenharmony_ci uint32_t speed; 733d0407baSopenharmony_ci uint32_t isSlave; 743d0407baSopenharmony_ci}; 753d0407baSopenharmony_ci 763d0407baSopenharmony_cistatic int32_t spidrv_readdrs(struct DeviceResourceNode *node, struct spi_params *params) 773d0407baSopenharmony_ci{ 783d0407baSopenharmony_ci int32_t ret; 793d0407baSopenharmony_ci struct DeviceResourceIface *iface = NULL; 803d0407baSopenharmony_ci 813d0407baSopenharmony_ci if (node == NULL) { 823d0407baSopenharmony_ci PRINT_ERR("%s: node is null\n", __func__); 833d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 843d0407baSopenharmony_ci } 853d0407baSopenharmony_ci if (params == NULL) { 863d0407baSopenharmony_ci PRINT_ERR("%s: params is null\n", __func__); 873d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 883d0407baSopenharmony_ci } 893d0407baSopenharmony_ci 903d0407baSopenharmony_ci iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); 913d0407baSopenharmony_ci if (iface == NULL) { 923d0407baSopenharmony_ci PRINT_ERR("%s: iface is null\n", __func__); 933d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 943d0407baSopenharmony_ci } 953d0407baSopenharmony_ci if (iface->GetUint32 == NULL) { 963d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32 is null\n", __func__); 973d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 983d0407baSopenharmony_ci } 993d0407baSopenharmony_ci 1003d0407baSopenharmony_ci memset_s(params, sizeof(struct spi_params), 0, sizeof(struct spi_params)); 1013d0407baSopenharmony_ci 1023d0407baSopenharmony_ci ret = iface->GetUint32(node, "bus", ¶ms->bus, 0); 1033d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1043d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(bus) failed\n", __func__); 1053d0407baSopenharmony_ci return HDF_FAILURE; 1063d0407baSopenharmony_ci } 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_ci ret = iface->GetUint32(node, "id", ¶ms->id, 0); 1093d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1103d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(id) failed\n", __func__); 1113d0407baSopenharmony_ci return HDF_FAILURE; 1123d0407baSopenharmony_ci } 1133d0407baSopenharmony_ci 1143d0407baSopenharmony_ci ret = iface->GetUint32(node, "func_mode", ¶ms->func_mode, 0); 1153d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1163d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(func_mode) failed\n", __func__); 1173d0407baSopenharmony_ci return HDF_FAILURE; 1183d0407baSopenharmony_ci } 1193d0407baSopenharmony_ci 1203d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_gpio", ¶ms->cs_gpio, 0); 1213d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1223d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_gpio) failed\n", __func__); 1233d0407baSopenharmony_ci return HDF_FAILURE; 1243d0407baSopenharmony_ci } 1253d0407baSopenharmony_ci 1263d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_func", ¶ms->cs_func, 0); 1273d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1283d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_func) failed\n", __func__); 1293d0407baSopenharmony_ci return HDF_FAILURE; 1303d0407baSopenharmony_ci } 1313d0407baSopenharmony_ci 1323d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_type", ¶ms->cs_type, 0); 1333d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1343d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_type) failed\n", __func__); 1353d0407baSopenharmony_ci return HDF_FAILURE; 1363d0407baSopenharmony_ci } 1373d0407baSopenharmony_ci 1383d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_drv", ¶ms->cs_drv, 0); 1393d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1403d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_drv) failed\n", __func__); 1413d0407baSopenharmony_ci return HDF_FAILURE; 1423d0407baSopenharmony_ci } 1433d0407baSopenharmony_ci 1443d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_dir", ¶ms->cs_dir, 0); 1453d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1463d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_dir) failed\n", __func__); 1473d0407baSopenharmony_ci return HDF_FAILURE; 1483d0407baSopenharmony_ci } 1493d0407baSopenharmony_ci 1503d0407baSopenharmony_ci ret = iface->GetUint32(node, "cs_val", ¶ms->cs_val, 0); 1513d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1523d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(cs_val) failed\n", __func__); 1533d0407baSopenharmony_ci return HDF_FAILURE; 1543d0407baSopenharmony_ci } 1553d0407baSopenharmony_ci 1563d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_gpio", ¶ms->clk_gpio, 0); 1573d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1583d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_gpio) failed\n", __func__); 1593d0407baSopenharmony_ci return HDF_FAILURE; 1603d0407baSopenharmony_ci } 1613d0407baSopenharmony_ci 1623d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_func", ¶ms->clk_func, 0); 1633d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1643d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_func) failed\n", __func__); 1653d0407baSopenharmony_ci return HDF_FAILURE; 1663d0407baSopenharmony_ci } 1673d0407baSopenharmony_ci 1683d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_type", ¶ms->clk_type, 0); 1693d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1703d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_type) failed\n", __func__); 1713d0407baSopenharmony_ci return HDF_FAILURE; 1723d0407baSopenharmony_ci } 1733d0407baSopenharmony_ci 1743d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_drv", ¶ms->clk_drv, 0); 1753d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1763d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_drv) failed\n", __func__); 1773d0407baSopenharmony_ci return HDF_FAILURE; 1783d0407baSopenharmony_ci } 1793d0407baSopenharmony_ci 1803d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_dir", ¶ms->clk_dir, 0); 1813d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1823d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_dir) failed\n", __func__); 1833d0407baSopenharmony_ci return HDF_FAILURE; 1843d0407baSopenharmony_ci } 1853d0407baSopenharmony_ci 1863d0407baSopenharmony_ci ret = iface->GetUint32(node, "clk_val", ¶ms->clk_val, 0); 1873d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1883d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(clk_val) failed\n", __func__); 1893d0407baSopenharmony_ci return HDF_FAILURE; 1903d0407baSopenharmony_ci } 1913d0407baSopenharmony_ci 1923d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_gpio", ¶ms->mosi_gpio, 0); 1933d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 1943d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_gpio) failed\n", __func__); 1953d0407baSopenharmony_ci return HDF_FAILURE; 1963d0407baSopenharmony_ci } 1973d0407baSopenharmony_ci 1983d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_func", ¶ms->mosi_func, 0); 1993d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2003d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_func) failed\n", __func__); 2013d0407baSopenharmony_ci return HDF_FAILURE; 2023d0407baSopenharmony_ci } 2033d0407baSopenharmony_ci 2043d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_type", ¶ms->mosi_type, 0); 2053d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2063d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_type) failed\n", __func__); 2073d0407baSopenharmony_ci return HDF_FAILURE; 2083d0407baSopenharmony_ci } 2093d0407baSopenharmony_ci 2103d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_drv", ¶ms->mosi_drv, 0); 2113d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2123d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_drv) failed\n", __func__); 2133d0407baSopenharmony_ci return HDF_FAILURE; 2143d0407baSopenharmony_ci } 2153d0407baSopenharmony_ci 2163d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_dir", ¶ms->mosi_dir, 0); 2173d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2183d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_dir) failed\n", __func__); 2193d0407baSopenharmony_ci return HDF_FAILURE; 2203d0407baSopenharmony_ci } 2213d0407baSopenharmony_ci 2223d0407baSopenharmony_ci ret = iface->GetUint32(node, "mosi_val", ¶ms->mosi_val, 0); 2233d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2243d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mosi_val) failed\n", __func__); 2253d0407baSopenharmony_ci return HDF_FAILURE; 2263d0407baSopenharmony_ci } 2273d0407baSopenharmony_ci 2283d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_gpio", ¶ms->miso_gpio, 0); 2293d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2303d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_gpio) failed\n", __func__); 2313d0407baSopenharmony_ci return HDF_FAILURE; 2323d0407baSopenharmony_ci } 2333d0407baSopenharmony_ci 2343d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_func", ¶ms->miso_func, 0); 2353d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2363d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_func) failed\n", __func__); 2373d0407baSopenharmony_ci return HDF_FAILURE; 2383d0407baSopenharmony_ci } 2393d0407baSopenharmony_ci 2403d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_type", ¶ms->miso_type, 0); 2413d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2423d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_type) failed\n", __func__); 2433d0407baSopenharmony_ci return HDF_FAILURE; 2443d0407baSopenharmony_ci } 2453d0407baSopenharmony_ci 2463d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_drv", ¶ms->miso_drv, 0); 2473d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2483d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_drv) failed\n", __func__); 2493d0407baSopenharmony_ci return HDF_FAILURE; 2503d0407baSopenharmony_ci } 2513d0407baSopenharmony_ci 2523d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_dir", ¶ms->miso_dir, 0); 2533d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2543d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_dir) failed\n", __func__); 2553d0407baSopenharmony_ci return HDF_FAILURE; 2563d0407baSopenharmony_ci } 2573d0407baSopenharmony_ci 2583d0407baSopenharmony_ci ret = iface->GetUint32(node, "miso_val", ¶ms->miso_val, 0); 2593d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2603d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(miso_val) failed\n", __func__); 2613d0407baSopenharmony_ci return HDF_FAILURE; 2623d0407baSopenharmony_ci } 2633d0407baSopenharmony_ci 2643d0407baSopenharmony_ci ret = iface->GetUint32(node, "bitsPerWord", ¶ms->bitsPerWord, 0); 2653d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2663d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(bitsPerWord) failed\n", __func__); 2673d0407baSopenharmony_ci return HDF_FAILURE; 2683d0407baSopenharmony_ci } 2693d0407baSopenharmony_ci 2703d0407baSopenharmony_ci ret = iface->GetUint32(node, "firstBit", ¶ms->firstBit, 0); 2713d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2723d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(firstBit) failed\n", __func__); 2733d0407baSopenharmony_ci return HDF_FAILURE; 2743d0407baSopenharmony_ci } 2753d0407baSopenharmony_ci 2763d0407baSopenharmony_ci ret = iface->GetUint32(node, "mode", ¶ms->mode, 0); 2773d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2783d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(mode) failed\n", __func__); 2793d0407baSopenharmony_ci return HDF_FAILURE; 2803d0407baSopenharmony_ci } 2813d0407baSopenharmony_ci 2823d0407baSopenharmony_ci ret = iface->GetUint32(node, "csm", ¶ms->csm, 0); 2833d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2843d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(csm) failed\n", __func__); 2853d0407baSopenharmony_ci return HDF_FAILURE; 2863d0407baSopenharmony_ci } 2873d0407baSopenharmony_ci 2883d0407baSopenharmony_ci ret = iface->GetUint32(node, "speed", ¶ms->speed, 0); 2893d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2903d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(speed) failed\n", __func__); 2913d0407baSopenharmony_ci return HDF_FAILURE; 2923d0407baSopenharmony_ci } 2933d0407baSopenharmony_ci 2943d0407baSopenharmony_ci ret = iface->GetUint32(node, "isSlave", ¶ms->isSlave, 0); 2953d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 2963d0407baSopenharmony_ci PRINT_ERR("%s: GetUint32(isSlave) failed\n", __func__); 2973d0407baSopenharmony_ci return HDF_FAILURE; 2983d0407baSopenharmony_ci } 2993d0407baSopenharmony_ci 3003d0407baSopenharmony_ci return HDF_SUCCESS; 3013d0407baSopenharmony_ci} 3023d0407baSopenharmony_ci 3033d0407baSopenharmony_cistatic int32_t spidrv_initdevice(const struct spi_params *params) 3043d0407baSopenharmony_ci{ 3053d0407baSopenharmony_ci unsigned int ret; 3063d0407baSopenharmony_ci SpiBusIo bus; 3073d0407baSopenharmony_ci LzSpiConfig config; 3083d0407baSopenharmony_ci unsigned int bus_id; 3093d0407baSopenharmony_ci 3103d0407baSopenharmony_ci if (params == NULL) { 3113d0407baSopenharmony_ci PRINT_ERR("%s: params is null\n", __func__); 3123d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 3133d0407baSopenharmony_ci } 3143d0407baSopenharmony_ci 3153d0407baSopenharmony_ci bus_id = (unsigned int)params->bus; 3163d0407baSopenharmony_ci 3173d0407baSopenharmony_ci memset_s(&bus, sizeof(bus), 0, sizeof(bus)); 3183d0407baSopenharmony_ci bus.id = (FuncID)params->id; 3193d0407baSopenharmony_ci bus.mode = (FuncMode)params->func_mode; 3203d0407baSopenharmony_ci bus.cs.gpio = (GpioID)params->cs_gpio; 3213d0407baSopenharmony_ci bus.cs.func = (MuxFunc)params->cs_func; 3223d0407baSopenharmony_ci bus.cs.type = (PullType)params->cs_type; 3233d0407baSopenharmony_ci bus.cs.drv = (DriveLevel)params->cs_drv; 3243d0407baSopenharmony_ci bus.cs.dir = (LzGpioDir)params->cs_dir; 3253d0407baSopenharmony_ci bus.cs.val = (LzGpioValue)params->cs_val; 3263d0407baSopenharmony_ci bus.mosi.gpio = (GpioID)params->mosi_gpio; 3273d0407baSopenharmony_ci bus.mosi.func = (MuxFunc)params->mosi_func; 3283d0407baSopenharmony_ci bus.mosi.type = (PullType)params->mosi_type; 3293d0407baSopenharmony_ci bus.mosi.drv = (DriveLevel)params->mosi_drv; 3303d0407baSopenharmony_ci bus.mosi.dir = (LzGpioDir)params->mosi_dir; 3313d0407baSopenharmony_ci bus.mosi.val = (LzGpioValue)params->mosi_val; 3323d0407baSopenharmony_ci bus.miso.gpio = (GpioID)params->miso_gpio; 3333d0407baSopenharmony_ci bus.miso.func = (MuxFunc)params->miso_func; 3343d0407baSopenharmony_ci bus.miso.type = (PullType)params->miso_type; 3353d0407baSopenharmony_ci bus.miso.drv = (DriveLevel)params->miso_drv; 3363d0407baSopenharmony_ci bus.miso.dir = (LzGpioDir)params->miso_dir; 3373d0407baSopenharmony_ci bus.miso.val = (LzGpioValue)params->miso_val; 3383d0407baSopenharmony_ci 3393d0407baSopenharmony_ci memset_s(&config, sizeof(config), 0, sizeof(config)); 3403d0407baSopenharmony_ci config.bitsPerWord = (unsigned int)params->bitsPerWord; 3413d0407baSopenharmony_ci config.firstBit = (unsigned int)params->firstBit; 3423d0407baSopenharmony_ci config.mode = (unsigned int)params->mode; 3433d0407baSopenharmony_ci config.csm = (unsigned int)params->csm; 3443d0407baSopenharmony_ci config.speed = (unsigned int)params->speed; 3453d0407baSopenharmony_ci config.isSlave = (unsigned int)params->isSlave; 3463d0407baSopenharmony_ci 3473d0407baSopenharmony_ci ret = SpiIoInit(bus); 3483d0407baSopenharmony_ci if (ret != LZ_HARDWARE_SUCCESS) { 3493d0407baSopenharmony_ci PRINT_ERR("%s: SpiIoInit failed(%u)\n", __func__, ret); 3503d0407baSopenharmony_ci } 3513d0407baSopenharmony_ci 3523d0407baSopenharmony_ci ret = LzSpiInit(bus_id, config); 3533d0407baSopenharmony_ci if (ret != LZ_HARDWARE_SUCCESS) { 3543d0407baSopenharmony_ci PRINT_ERR("%s: LzSpiInit failed(%u)\n", __func__, ret); 3553d0407baSopenharmony_ci } 3563d0407baSopenharmony_ci 3573d0407baSopenharmony_ci return HDF_SUCCESS; 3583d0407baSopenharmony_ci} 3593d0407baSopenharmony_ci 3603d0407baSopenharmony_cistatic void spidrv_deinitdevice(const struct spi_params *params) 3613d0407baSopenharmony_ci{ 3623d0407baSopenharmony_ci unsigned int bus_id; 3633d0407baSopenharmony_ci 3643d0407baSopenharmony_ci if (params == NULL) { 3653d0407baSopenharmony_ci PRINT_ERR("%s: params is null\n", __func__); 3663d0407baSopenharmony_ci return; 3673d0407baSopenharmony_ci } 3683d0407baSopenharmony_ci 3693d0407baSopenharmony_ci bus_id = (unsigned int)params->bus; 3703d0407baSopenharmony_ci LzSpiDeinit(bus_id); 3713d0407baSopenharmony_ci} 3723d0407baSopenharmony_ci 3733d0407baSopenharmony_cistatic int32_t spidrv_open(struct SpiCntlr *cntlr) 3743d0407baSopenharmony_ci{ 3753d0407baSopenharmony_ci int32_t ret; 3763d0407baSopenharmony_ci struct spi_params *params = NULL; 3773d0407baSopenharmony_ci 3783d0407baSopenharmony_ci if (cntlr == NULL) { 3793d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 3803d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 3813d0407baSopenharmony_ci } 3823d0407baSopenharmony_ci if (cntlr->priv == NULL) { 3833d0407baSopenharmony_ci PRINT_ERR("%s: cntlr->priv is null\n", __func__); 3843d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 3853d0407baSopenharmony_ci } 3863d0407baSopenharmony_ci 3873d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 3883d0407baSopenharmony_ci 3893d0407baSopenharmony_ci ret = spidrv_initdevice(params); 3903d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 3913d0407baSopenharmony_ci PRINT_ERR("%s: spidrv_initdevice error\n", __func__); 3923d0407baSopenharmony_ci return HDF_FAILURE; 3933d0407baSopenharmony_ci } 3943d0407baSopenharmony_ci 3953d0407baSopenharmony_ci return HDF_SUCCESS; 3963d0407baSopenharmony_ci} 3973d0407baSopenharmony_ci 3983d0407baSopenharmony_cistatic int32_t spidrv_close(struct SpiCntlr *cntlr) 3993d0407baSopenharmony_ci{ 4003d0407baSopenharmony_ci struct spi_params *params = NULL; 4013d0407baSopenharmony_ci 4023d0407baSopenharmony_ci if (cntlr == NULL) { 4033d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 4043d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 4053d0407baSopenharmony_ci } 4063d0407baSopenharmony_ci if (cntlr->priv == NULL) { 4073d0407baSopenharmony_ci PRINT_ERR("%s: cntlr->priv is null\n", __func__); 4083d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 4093d0407baSopenharmony_ci } 4103d0407baSopenharmony_ci 4113d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 4123d0407baSopenharmony_ci 4133d0407baSopenharmony_ci /* 销毁硬件设备 */ 4143d0407baSopenharmony_ci spidrv_deinitdevice(params); 4153d0407baSopenharmony_ci 4163d0407baSopenharmony_ci return HDF_SUCCESS; 4173d0407baSopenharmony_ci} 4183d0407baSopenharmony_ci 4193d0407baSopenharmony_cistatic int32_t spidrv_setcfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) 4203d0407baSopenharmony_ci{ 4213d0407baSopenharmony_ci struct spi_params *params = NULL; 4223d0407baSopenharmony_ci 4233d0407baSopenharmony_ci if (cntlr == NULL) { 4243d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 4253d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 4263d0407baSopenharmony_ci } 4273d0407baSopenharmony_ci if (cntlr->priv == NULL) { 4283d0407baSopenharmony_ci PRINT_ERR("%s: cntlr->priv is null\n", __func__); 4293d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 4303d0407baSopenharmony_ci } 4313d0407baSopenharmony_ci if (cfg == NULL) { 4323d0407baSopenharmony_ci PRINT_ERR("%s: cfg is null\n", __func__); 4333d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 4343d0407baSopenharmony_ci } 4353d0407baSopenharmony_ci 4363d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 4373d0407baSopenharmony_ci 4383d0407baSopenharmony_ci params->speed = cfg->maxSpeedHz; 4393d0407baSopenharmony_ci params->bitsPerWord = cfg->bitsPerWord; 4403d0407baSopenharmony_ci 4413d0407baSopenharmony_ci /* LiteOS的标准定义转化为LzHardware的定义 */ 4423d0407baSopenharmony_ci params->mode = 0; 4433d0407baSopenharmony_ci if (cfg->mode & SPI_CLK_PHASE) { 4443d0407baSopenharmony_ci params->mode |= SPI_CPHA; 4453d0407baSopenharmony_ci } 4463d0407baSopenharmony_ci if (cfg->mode & SPI_CLK_POLARITY) { 4473d0407baSopenharmony_ci params->mode |= SPI_CPOL; 4483d0407baSopenharmony_ci } 4493d0407baSopenharmony_ci if (cfg->mode & SPI_MODE_3WIRE) { 4503d0407baSopenharmony_ci PRINT_ERR("%s: SPI_MODE_3WIRE is not support!\n", __func__); 4513d0407baSopenharmony_ci } 4523d0407baSopenharmony_ci if (cfg->mode & SPI_MODE_LOOP) { 4533d0407baSopenharmony_ci PRINT_ERR("%s: SPI_MODE_3WIRE is not support!\n", __func__); 4543d0407baSopenharmony_ci } 4553d0407baSopenharmony_ci if ((cfg->mode & SPI_MODE_LSBFE) == 0) { 4563d0407baSopenharmony_ci params->mode |= SPI_MSB; 4573d0407baSopenharmony_ci } 4583d0407baSopenharmony_ci if (cfg->mode & SPI_MODE_NOCS) { 4593d0407baSopenharmony_ci PRINT_ERR("%s: SPI_MODE_NOCS is not support!\n", __func__); 4603d0407baSopenharmony_ci } 4613d0407baSopenharmony_ci if (cfg->mode & SPI_MODE_CS_HIGH) { 4623d0407baSopenharmony_ci PRINT_ERR("%s: SPI_MODE_CS_HIGH is not support!\n", __func__); 4633d0407baSopenharmony_ci } 4643d0407baSopenharmony_ci if (cfg->mode & SPI_MODE_READY) { 4653d0407baSopenharmony_ci PRINT_ERR("%s: SPI_MODE_READY is not support!\n", __func__); 4663d0407baSopenharmony_ci } 4673d0407baSopenharmony_ci if (params->isSlave == 0) { 4683d0407baSopenharmony_ci params->mode |= SPI_SLAVE; 4693d0407baSopenharmony_ci } else { 4703d0407baSopenharmony_ci params->mode &= ~(SPI_SLAVE); 4713d0407baSopenharmony_ci } 4723d0407baSopenharmony_ci 4733d0407baSopenharmony_ci switch (cfg->transferMode) { 4743d0407baSopenharmony_ci case SPI_INTERRUPT_TRANSFER: 4753d0407baSopenharmony_ci break; 4763d0407baSopenharmony_ci 4773d0407baSopenharmony_ci case SPI_POLLING_TRANSFER: 4783d0407baSopenharmony_ci PRINT_ERR("%s: SPI_POLLING_TRANSFER is not support!\n", __func__); 4793d0407baSopenharmony_ci break; 4803d0407baSopenharmony_ci 4813d0407baSopenharmony_ci case SPI_DMA_TRANSFER: 4823d0407baSopenharmony_ci PRINT_ERR("%s: SPI_DMA_TRANSFER is not support!\n", __func__); 4833d0407baSopenharmony_ci break; 4843d0407baSopenharmony_ci 4853d0407baSopenharmony_ci default: 4863d0407baSopenharmony_ci PRINT_ERR("%s: %d is not support!\n", __func__, cfg->transferMode); 4873d0407baSopenharmony_ci break; 4883d0407baSopenharmony_ci } 4893d0407baSopenharmony_ci 4903d0407baSopenharmony_ci spidrv_initdevice(params); 4913d0407baSopenharmony_ci 4923d0407baSopenharmony_ci return HDF_SUCCESS; 4933d0407baSopenharmony_ci} 4943d0407baSopenharmony_ci 4953d0407baSopenharmony_cistatic int32_t spidrv_getcfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) 4963d0407baSopenharmony_ci{ 4973d0407baSopenharmony_ci struct spi_params *params = NULL; 4983d0407baSopenharmony_ci 4993d0407baSopenharmony_ci if (cntlr == NULL) { 5003d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 5013d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5023d0407baSopenharmony_ci } 5033d0407baSopenharmony_ci if (cntlr->priv == NULL) { 5043d0407baSopenharmony_ci PRINT_ERR("%s: cntlr->priv is null\n", __func__); 5053d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5063d0407baSopenharmony_ci } 5073d0407baSopenharmony_ci if (cfg == NULL) { 5083d0407baSopenharmony_ci PRINT_ERR("%s: cfg is null\n", __func__); 5093d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5103d0407baSopenharmony_ci } 5113d0407baSopenharmony_ci 5123d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 5133d0407baSopenharmony_ci 5143d0407baSopenharmony_ci cfg->maxSpeedHz = params->speed; 5153d0407baSopenharmony_ci cfg->bitsPerWord = params->bitsPerWord; 5163d0407baSopenharmony_ci 5173d0407baSopenharmony_ci /* LzHardware的定义转化为LiteOS的标准定义 */ 5183d0407baSopenharmony_ci cfg->mode = 0; 5193d0407baSopenharmony_ci if (params->mode & SPI_CPHA) { 5203d0407baSopenharmony_ci cfg->mode |= SPI_CLK_PHASE; 5213d0407baSopenharmony_ci } 5223d0407baSopenharmony_ci if (params->mode & SPI_CPOL) { 5233d0407baSopenharmony_ci cfg->mode |= SPI_CLK_POLARITY; 5243d0407baSopenharmony_ci } 5253d0407baSopenharmony_ci if ((params->mode & SPI_MSB) == 0) { 5263d0407baSopenharmony_ci cfg->mode |= SPI_MODE_LSBFE; 5273d0407baSopenharmony_ci } 5283d0407baSopenharmony_ci 5293d0407baSopenharmony_ci cfg->transferMode = SPI_INTERRUPT_TRANSFER; 5303d0407baSopenharmony_ci 5313d0407baSopenharmony_ci return HDF_SUCCESS; 5323d0407baSopenharmony_ci} 5333d0407baSopenharmony_ci 5343d0407baSopenharmony_cistatic int32_t spidrv_transfer(struct SpiCntlr *cntlr, struct SpiMsg *msgs, uint32_t count) 5353d0407baSopenharmony_ci{ 5363d0407baSopenharmony_ci unsigned int ret; 5373d0407baSopenharmony_ci struct spi_params *params = NULL; 5383d0407baSopenharmony_ci unsigned int bus_id; 5393d0407baSopenharmony_ci uint32_t i; 5403d0407baSopenharmony_ci struct SpiMsg *msg; 5413d0407baSopenharmony_ci LzSpiMsg lz_spi_msg; 5423d0407baSopenharmony_ci 5433d0407baSopenharmony_ci if (cntlr == NULL) { 5443d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 5453d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5463d0407baSopenharmony_ci } 5473d0407baSopenharmony_ci if (cntlr->priv == NULL) { 5483d0407baSopenharmony_ci PRINT_ERR("%s: cntlr->priv is null\n", __func__); 5493d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5503d0407baSopenharmony_ci } 5513d0407baSopenharmony_ci if (msgs == NULL) { 5523d0407baSopenharmony_ci PRINT_ERR("%s: msgs is null\n", __func__); 5533d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5543d0407baSopenharmony_ci } 5553d0407baSopenharmony_ci 5563d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 5573d0407baSopenharmony_ci bus_id = (unsigned int)params->bus; 5583d0407baSopenharmony_ci 5593d0407baSopenharmony_ci for (i = 0; i < count; i++) { 5603d0407baSopenharmony_ci msg = &msgs[i]; 5613d0407baSopenharmony_ci 5623d0407baSopenharmony_ci if ((msg->wbuf != NULL) && (msg->rbuf != NULL)) { 5633d0407baSopenharmony_ci ret = LzSpiWriteAndRead(bus_id, 0, msg->wbuf, msg->rbuf, msg->len); 5643d0407baSopenharmony_ci if (ret != LZ_HARDWARE_SUCCESS) { 5653d0407baSopenharmony_ci PRINT_ERR("%s: LzSpiWriteAndRead error\n", __func__); 5663d0407baSopenharmony_ci return HDF_ERR_IO; 5673d0407baSopenharmony_ci } 5683d0407baSopenharmony_ci } else if ((msg->wbuf != NULL) && (msg->rbuf == NULL)) { 5693d0407baSopenharmony_ci ret = LzSpiWrite(bus_id, 0, msg->wbuf, msg->len); 5703d0407baSopenharmony_ci if (ret != LZ_HARDWARE_SUCCESS) { 5713d0407baSopenharmony_ci PRINT_ERR("%s: LzSpiWrite error\n", __func__); 5723d0407baSopenharmony_ci return HDF_ERR_IO; 5733d0407baSopenharmony_ci } 5743d0407baSopenharmony_ci } else if ((msg->wbuf == NULL) && (msg->rbuf != NULL)) { 5753d0407baSopenharmony_ci ret = LzSpiRead(bus_id, 0, msg->rbuf, msg->len); 5763d0407baSopenharmony_ci if (ret != LZ_HARDWARE_SUCCESS) { 5773d0407baSopenharmony_ci PRINT_ERR("%s: LzSpiRead error\n", __func__); 5783d0407baSopenharmony_ci return HDF_ERR_IO; 5793d0407baSopenharmony_ci } 5803d0407baSopenharmony_ci } else { 5813d0407baSopenharmony_ci PRINT_ERR("%s: i = %d, msg->wbuf or msg->rbuf is null\n", __func__, i); 5823d0407baSopenharmony_ci return HDF_ERR_INVALID_PARAM; 5833d0407baSopenharmony_ci } 5843d0407baSopenharmony_ci } 5853d0407baSopenharmony_ci 5863d0407baSopenharmony_ci return HDF_SUCCESS; 5873d0407baSopenharmony_ci} 5883d0407baSopenharmony_ci 5893d0407baSopenharmony_cistatic struct SpiCntlrMethod m_spi_method = { 5903d0407baSopenharmony_ci .Open = spidrv_open, 5913d0407baSopenharmony_ci .Close = spidrv_close, 5923d0407baSopenharmony_ci .SetCfg = spidrv_setcfg, 5933d0407baSopenharmony_ci .GetCfg = spidrv_getcfg, 5943d0407baSopenharmony_ci .Transfer = spidrv_transfer, 5953d0407baSopenharmony_ci}; 5963d0407baSopenharmony_ci 5973d0407baSopenharmony_cistatic int32_t spidrv_bind(struct HdfDeviceObject *device) 5983d0407baSopenharmony_ci{ 5993d0407baSopenharmony_ci return HDF_SUCCESS; 6003d0407baSopenharmony_ci} 6013d0407baSopenharmony_ci 6023d0407baSopenharmony_cistatic int32_t spidrv_init(struct HdfDeviceObject *device) 6033d0407baSopenharmony_ci{ 6043d0407baSopenharmony_ci int32_t ret; 6053d0407baSopenharmony_ci struct SpiCntlr *cntlr = NULL; 6063d0407baSopenharmony_ci struct spi_params *params = NULL; 6073d0407baSopenharmony_ci 6083d0407baSopenharmony_ci HDF_LOGI("%s: Enter", __func__); 6093d0407baSopenharmony_ci if ((device == NULL) || (device->property == NULL)) { 6103d0407baSopenharmony_ci PRINT_ERR("%s: device or property is null\n", __func__); 6113d0407baSopenharmony_ci return HDF_ERR_INVALID_OBJECT; 6123d0407baSopenharmony_ci } 6133d0407baSopenharmony_ci 6143d0407baSopenharmony_ci cntlr = (struct SpiCntlr *)OsalMemAlloc(sizeof(struct SpiCntlr)); 6153d0407baSopenharmony_ci params = (struct spi_params *)OsalMemAlloc(sizeof(struct spi_params)); 6163d0407baSopenharmony_ci 6173d0407baSopenharmony_ci if (cntlr == NULL) { 6183d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 6193d0407baSopenharmony_ci if (cntlr != NULL) { 6203d0407baSopenharmony_ci OsalMemFree(cntlr); 6213d0407baSopenharmony_ci cntlr = NULL; 6223d0407baSopenharmony_ci } 6233d0407baSopenharmony_ci if (params != NULL) { 6243d0407baSopenharmony_ci OsalMemFree(params); 6253d0407baSopenharmony_ci params = NULL; 6263d0407baSopenharmony_ci } 6273d0407baSopenharmony_ci return HDF_ERR_MALLOC_FAIL; 6283d0407baSopenharmony_ci } 6293d0407baSopenharmony_ci if (params == NULL) { 6303d0407baSopenharmony_ci PRINT_ERR("%s: params is null\n", __func__); 6313d0407baSopenharmony_ci if (cntlr != NULL) { 6323d0407baSopenharmony_ci OsalMemFree(cntlr); 6333d0407baSopenharmony_ci cntlr = NULL; 6343d0407baSopenharmony_ci } 6353d0407baSopenharmony_ci if (params != NULL) { 6363d0407baSopenharmony_ci OsalMemFree(params); 6373d0407baSopenharmony_ci params = NULL; 6383d0407baSopenharmony_ci } 6393d0407baSopenharmony_ci return HDF_ERR_MALLOC_FAIL; 6403d0407baSopenharmony_ci } 6413d0407baSopenharmony_ci 6423d0407baSopenharmony_ci ret = spidrv_readdrs(device->property, params); 6433d0407baSopenharmony_ci if (ret != HDF_SUCCESS) { 6443d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 6453d0407baSopenharmony_ci if (cntlr != NULL) { 6463d0407baSopenharmony_ci OsalMemFree(cntlr); 6473d0407baSopenharmony_ci cntlr = NULL; 6483d0407baSopenharmony_ci } 6493d0407baSopenharmony_ci if (params != NULL) { 6503d0407baSopenharmony_ci OsalMemFree(params); 6513d0407baSopenharmony_ci params = NULL; 6523d0407baSopenharmony_ci } 6533d0407baSopenharmony_ci return ret; 6543d0407baSopenharmony_ci } 6553d0407baSopenharmony_ci 6563d0407baSopenharmony_ci /* 数据对齐 */ 6573d0407baSopenharmony_ci cntlr->busNum = params->bus; 6583d0407baSopenharmony_ci cntlr->numCs = 1; 6593d0407baSopenharmony_ci cntlr->curCs = 0; 6603d0407baSopenharmony_ci cntlr->priv = (void *)params; 6613d0407baSopenharmony_ci /* 注册回调函数,并初始化SpiCntlr */ 6623d0407baSopenharmony_ci cntlr->method = &m_spi_method; 6633d0407baSopenharmony_ci device->service = &cntlr->service; 6643d0407baSopenharmony_ci cntlr->device = device; 6653d0407baSopenharmony_ci cntlr->priv = (void *)params; 6663d0407baSopenharmony_ci 6673d0407baSopenharmony_ci PRINT_LOG("spi service: %s init success!\n", HdfDeviceGetServiceName(device)); 6683d0407baSopenharmony_ci return HDF_SUCCESS; 6693d0407baSopenharmony_ci} 6703d0407baSopenharmony_ci 6713d0407baSopenharmony_cistatic void spidrv_release(struct HdfDeviceObject *device) 6723d0407baSopenharmony_ci{ 6733d0407baSopenharmony_ci struct SpiCntlr *cntlr = NULL; 6743d0407baSopenharmony_ci struct spi_params *params = NULL; 6753d0407baSopenharmony_ci 6763d0407baSopenharmony_ci HDF_LOGI("%s: Enter", __func__); 6773d0407baSopenharmony_ci if ((device == NULL) || (device->property == NULL)) { 6783d0407baSopenharmony_ci PRINT_ERR("%s: device or property is null\n", __func__); 6793d0407baSopenharmony_ci return; 6803d0407baSopenharmony_ci } 6813d0407baSopenharmony_ci 6823d0407baSopenharmony_ci cntlr = SpiCntlrFromDevice(device); 6833d0407baSopenharmony_ci if (cntlr == NULL) { 6843d0407baSopenharmony_ci PRINT_ERR("%s: cntlr is null\n", __func__); 6853d0407baSopenharmony_ci return; 6863d0407baSopenharmony_ci } 6873d0407baSopenharmony_ci 6883d0407baSopenharmony_ci params = (struct spi_params *)cntlr->priv; 6893d0407baSopenharmony_ci 6903d0407baSopenharmony_ci /* 销毁SPI参数 */ 6913d0407baSopenharmony_ci if (params != NULL) { 6923d0407baSopenharmony_ci OsalMemFree(params); 6933d0407baSopenharmony_ci params = NULL; 6943d0407baSopenharmony_ci } 6953d0407baSopenharmony_ci 6963d0407baSopenharmony_ci /* 销毁SpiCntlr */ 6973d0407baSopenharmony_ci cntlr->priv = NULL; 6983d0407baSopenharmony_ci if (cntlr != NULL) { 6993d0407baSopenharmony_ci OsalMemFree(cntlr); 7003d0407baSopenharmony_ci cntlr = NULL; 7013d0407baSopenharmony_ci } 7023d0407baSopenharmony_ci 7033d0407baSopenharmony_ci PRINT_LOG("spi service: %s release!\n", HdfDeviceGetServiceName(device)); 7043d0407baSopenharmony_ci} 7053d0407baSopenharmony_ci 7063d0407baSopenharmony_cistruct HdfDriverEntry g_spiDriverEntry = { 7073d0407baSopenharmony_ci .moduleVersion = 1, 7083d0407baSopenharmony_ci .moduleName = "HDF_PLATFORM_SPI", 7093d0407baSopenharmony_ci .Init = spidrv_init, 7103d0407baSopenharmony_ci .Release = spidrv_release, 7113d0407baSopenharmony_ci .Bind = spidrv_bind, 7123d0407baSopenharmony_ci}; 7133d0407baSopenharmony_ci 7143d0407baSopenharmony_ciHDF_INIT(g_spiDriverEntry); 715