• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef DISPLAY_DEVICE_COMMON_H
17 #define DISPLAY_DEVICE_COMMON_H
18 
19 #include <buffer_handle_parcel.h>
20 #include <display_type.h>
21 #include <fcntl.h>
22 #include <hdf_base.h>
23 #include <hdf_log.h>
24 #include <iservmgr_hdi.h>
25 #include <map>
26 #include <message_option.h>
27 #include <message_parcel.h>
28 #include <osal_mem.h>
29 #include <securec.h>
30 #include <unistd.h>
31 #include "display_device.h"
32 #include "display_layer.h"
33 
34 #define DISPLAY_LOG(fmt, args...) HDF_LOGD("DispDevDbg %{public}s / %{public}d :" fmt, __func__, __LINE__, ##args)
35 #define DISPLAY_START DISPLAY_LOG("START")
36 #define DISPLAY_END DISPLAY_LOG("END")
37 
38 const int32_t HDF_DISPLAY_DRIVER_FUNC_NUM_MAX = 50;
39 /*****cmdId bit status****
40 ** 0000 0000 0000 1111 0000 0000 0000 0000 functionType
41 ** 0000 0000 0000 0000 0000 0000 1111 1111 functionNum
42 ** 0000 0000 0000 0000 0001 0000 0000 0000 isBatchCommand
43 ** 0000 0000 0000 0000 0010 0000 0000 0000 BatchCommandEndFlag
44 ** 1111 1111 1111 0000 1100 1111 0000 0000 reserved  */
45 
46 /* single command data : ************    * mean parameter, E mean batch command end flag
47 ** batch  command data : CL*CL*CL*N|E    N mean command number with batch flag
48 ** common receive reply: CL*CL*CL*N|E    C mean command, L mean parameter length **/
49 const uint32_t BATCH_CMD_FLAG = 0x1000;
50 const int32_t COMPOSER_CMD_MAX_NUM = 128;
51 const int32_t STRMAXLEN = 100;
52 const int32_t COMPOSER_SERVER_ARRAY_NUMBER_MAX = 256;
53 
54 enum {
55     HDF_DISPLAY_DRIVER_FUNC_TYPE_INVALID,
56     HDF_DISPLAY_DRIVER_FUNC_TYPE_DEVICE,
57     HDF_DISPLAY_DRIVER_FUNC_TYPE_LAYER,
58     HDF_DISPLAY_DRIVER_FUNC_TYPE_MAX
59 };
60 using DisplayDeviceCommandId = enum {
61     DSP_CMD_INVALID = 0x00000,
62     DSP_CMD_EXECUTECMD = 0x00001,
63     // device
64     DSP_CMD_RESERVED_1001 = 0x10000 | 1,
65     DSP_CMD_RESERVED_1002 = 0x10000 | 2,
66     DSP_CMD_REGHOTPLUGCALLBACK = 0x10000 | 3,
67     DSP_CMD_GETDISPLAYCAPABILITY = 0x10000 | 4,
68     DSP_CMD_GETDISPLAYSUPPORTEDMODES = 0x10000 | 5,
69     DSP_CMD_GETDISPLAYMODE = 0x10000 | 6,
70     DSP_CMD_SETDISPLAYMODE = 0x10000 | 7,
71     DSP_CMD_GETDISPLAYPOWERSTATUS = 0x10000 | 8,
72     DSP_CMD_SETDISPLAYPOWERSTATUS = 0x10000 | 9,
73     DSP_CMD_GETDISPLAYBACKLIGHT = 0x10000 | 10,
74     DSP_CMD_SETDISPLAYBACKLIGHT = 0x10000 | 11,
75     DSP_CMD_GETDISPLAYPROPERTY = 0x10000 | 12,
76     DSP_CMD_SETDISPLAYPROPERTY = 0x10000 | 13,
77     DSP_CMD_PREPAREDISPLAYLAYERS = 0x10000 | 14 | 0x1000,
78     DSP_CMD_RESERVED_1015 = 0x10000 | 15,
79     DSP_CMD_GETDISPLAYCOMPCHANGE = 0x10000 | 16,
80     DSP_CMD_RESERVED_1017 = 0x10000 | 17,
81     DSP_CMD_SETDISPLAYCLIENTCROP = 0x10000 | 18,
82     DSP_CMD_SETDISPLAYCLIENTDESTRECT = 0x10000 | 19,
83     DSP_CMD_SETDISPLAYCLIENTBUFFER = 0x10000 | 20 | 0x1000,
84     DSP_CMD_SETDISPLAYCLIENTDAMAGE = 0x10000 | 21 | 0x1000,
85     DSP_CMD_SETDISPLAYVSYNCENABLED = 0x10000 | 22,
86     DSP_CMD_RESERVED_1023 = 0x10000 | 23,
87     DSP_CMD_RESERVED_1024 = 0x10000 | 24,
88     DSP_CMD_REGDISPLAYVBLANKCALLBACK = 0x10000 | 25,
89     DSP_CMD_RESERVED_1026 = 0x10000 | 26,
90     DSP_CMD_GETDISPLAYRELEASEFENCE = 0x10000 | 27,
91     DSP_CMD_COMMIT = 0x10000 | 28 | 0x1000,
92     DSP_CMD_INVOKEDISPLAYCMD = 0x10000 | 29 | 0x1000,
93     DSP_CMD_CREATEVIRTUALDISPLAY = 0x10000 | 30,
94     DSP_CMD_DESTROYVIRTUALDISPLAY = 0x10000 | 31,
95     DSP_CMD_SETVIRTUALDISPLAYBUFFER = 0x10000 | 32,
96     DSP_CMD_REGDISPLAYREFRESHCALLBACK = 0x10000 | 33,
97     DSP_CMD_GETWRITEBACKFRAME = 0x10000 | 34,
98     DSP_CMD_CREATEWRITEBACK = 0x10000 | 35,
99     DSP_CMD_DESTROYWRITEBACK = 0x10000 | 36,
100     DSP_CMD_SET_PROXY_REMOTE_CALLBACK = 0x10000 | 37,
101     // layer
102     DSP_CMD_RESERVED_2001 = 0x20000 | 1,
103     DSP_CMD_RESERVED_2002 = 0x20000 | 2,
104     DSP_CMD_CREATELAYER = 0x20000 | 3,
105     DSP_CMD_RESERVED_2004 = 0x20000 | 4,
106     DSP_CMD_SETLAYERVISIBLE = 0x20000 | 5 | 0x1000,
107     DSP_CMD_GETLAYERVISIBLESTATE = 0x20000 | 6,
108     DSP_CMD_RESERVED_2007 = 0x20000 | 7,
109     DSP_CMD_RESERVED_2008 = 0x20000 | 8,
110     DSP_CMD_SETLAYERCROP = 0x20000 | 9 | 0x1000,
111     DSP_CMD_SETLAYERZORDER = 0x20000 | 10 | 0x1000,
112     DSP_CMD_GETLAYERZORDER = 0x20000 | 11,
113     DSP_CMD_SETLAYERPREMULTI = 0x20000 | 12 | 0x1000,
114     DSP_CMD_GETLAYERPREMULTI = 0x20000 | 13,
115     DSP_CMD_SETLAYERALPHA = 0x20000 | 14 | 0x1000,
116     DSP_CMD_GETLAYERALPHA = 0x20000 | 15,
117     DSP_CMD_SETLAYERCOLORKEY = 0x20000 | 16 | 0x1000,
118     DSP_CMD_GETLAYERCOLORKEY = 0x20000 | 17,
119     DSP_CMD_SETLAYERPALETTE = 0x20000 | 18 | 0x1000,
120     DSP_CMD_GETLAYERPALETTE = 0x20000 | 19,
121     DSP_CMD_RESERVED_2020 = 0x20000 | 20,
122     DSP_CMD_SETLAYERCOMPRESSION = 0x20000 | 21 | 0x1000,
123     DSP_CMD_GETLAYERCOMPRESSION = 0x20000 | 22,
124     DSP_CMD_RESERVED_2023 = 0x20000 | 23,
125     DSP_CMD_FLUSH = 0x20000 | 24 | 0x1000,
126     DSP_CMD_SETLAYERVISIBLEREGION = 0x20000 | 25 | 0x1000,
127     DSP_CMD_SETLAYERDIRTYREGION = 0x20000 | 26 | 0x1000,
128     DSP_CMD_GETLAYERBUFFER = 0x20000 | 27,
129     DSP_CMD_SETLAYERBUFFER = 0x20000 | 28 | 0x1000,
130     DSP_CMD_INVOKELAYERCMD = 0x20000 | 29 | 0x1000,
131     DSP_CMD_SETLAYERCOMPOSITIONTYPE = 0x20000 | 30 | 0x1000,
132     DSP_CMD_RESERVED_2031 = 0x20000 | 31,
133     DSP_CMD_INITDISPLAY = 0x20000 | 32,
134     DSP_CMD_DEINITDISPLAY = 0x20000 | 33,
135     DSP_CMD_GETDISPLAYINFO = 0x20000 | 34,
136     DSP_CMD_CLOSELAYER = 0x20000 | 35,
137     DSP_CMD_SETLAYERSIZE = 0x20000 | 36 | 0x1000,
138     DSP_CMD_GETLAYERSIZE = 0x20000 | 37,
139     DSP_CMD_SETTRANSFORMMODE = 0x20000 | 38 | 0x1000,
140     DSP_CMD_WAITFORVBLANK = 0x20000 | 39,
141     DSP_CMD_SNAPSHOT = 0x20000 | 40,
142     DSP_CMD_SETLAYERBLENDTYPE = 0x20000 | 41 | 0x1000
143 };
144 using HotPlugCallback = void (*)(uint32_t outputId, bool connected, void *data);
145 using VBlankCallback = void (*)(unsigned int sequence, uint64_t ns, void *data);
146 using PageFlipCallback = void (*)(unsigned int sequence, uint64_t ns, void *data);
147 using RefreshCallback = void (*)(uint32_t devId, void *data);
148 
149 using CommandId = int32_t;
150 using BlendOpt = int32_t;
151 
152 DispPowerStatus Convert2PowerStatus(int32_t x);
153 CompositionType Convert2CompositionType(int32_t x);
154 TransformType Convert2TransformType(int32_t x);
155 BlendType Convert2BlendTypeType(int32_t x);
156 
157 bool DisplayDeviceWriteCmdId(OHOS::MessageParcel *parcel, DisplayDeviceCommandId cmdId);
158 DisplayDeviceCommandId DisplayDeviceReadCmdId(OHOS::MessageParcel *parcel);
159 bool DisplayDeviceWriteUint32(OHOS::MessageParcel *parcel, uint32_t data);
160 bool DisplayDeviceReadUint32(uint32_t *data, OHOS::MessageParcel *parcel);
161 bool DisplayDeviceWriteInt32(OHOS::MessageParcel *parcel, int32_t data);
162 bool DisplayDeviceReadInt32(int32_t *data, OHOS::MessageParcel *parcel);
163 bool DisplayDeviceWriteBool(OHOS::MessageParcel *parcel, bool data);
164 bool DisplayDeviceReadBool(bool *data, OHOS::MessageParcel *parcel);
165 bool DisplayDeviceWriteUint64(OHOS::MessageParcel *parcel, uint64_t data);
166 bool DisplayDeviceReadUint64(uint64_t *data, OHOS::MessageParcel *parcel);
167 bool DisplayDeviceWritePtr(OHOS::MessageParcel *parcel, uintptr_t data);
168 bool DisplayDeviceReadPtr(uintptr_t *&data, OHOS::MessageParcel *parcel);
169 bool DisplayDeviceWriteBufHdl(OHOS::MessageParcel *parcel, const BufferHandle *data);
170 bool DisplayDeviceReadBufHdl(BufferHandle *&data, OHOS::MessageParcel *parcel);
171 bool DisplayDeviceWriteFileDescriptor(OHOS::MessageParcel *parcel, const int fd);
172 bool DisplayDeviceReadFileDescriptor(int *fd, OHOS::MessageParcel *parcel);
173 bool DisplayDeviceWriteFileDescriptorArray(OHOS::MessageParcel *parcel, const int *fd, uint32_t num = 1);
174 bool DisplayDeviceReadFileDescriptorArray(int *fd, OHOS::MessageParcel *parcel, uint32_t num = 1);
175 
176 template <typename T>
177 bool DisplayDeviceWriteData(OHOS::MessageParcel *parcel, const T *data, uint32_t num = 1)
178 {
179     if (nullptr == parcel || nullptr == data || num == 0) {
180         DISPLAY_LOG("error: OHOS::MessageParcel %{public}s nullptr, data %{public}s nullptr, num %{public}s 0",
181             nullptr == parcel ? "is" : "is not", nullptr == data ? "is" : "is not", 0 == num ? "is" : "is not");
182         return false;
183     }
184 
185     if (!parcel->WriteUint32(sizeof(T) * num)) {
186         DISPLAY_LOG("error: write data length into parcel failed");
187         return false;
188     }
189 
190     if (!parcel->WriteBuffer(data, sizeof(T) * num)) {
191         DISPLAY_LOG("error: write data into parcel failed");
192         return false;
193     }
194     return true;
195 }
196 template <typename T>
197 bool DisplayDeviceReadData(T *data, OHOS::MessageParcel *parcel, uint32_t num = 1)
198 {
199     if (nullptr == parcel || nullptr == data || num == 0) {
200         DISPLAY_LOG("error: OHOS::MessageParcel %{public}s nullptr, data %{public}s nullptr, num %{public}s 0",
201             nullptr == parcel ? "is" : "is not", nullptr == data ? "is" : "is not", 0 == num ? "is" : "is not");
202         return false;
203     }
204 
205     uint32_t retValueLen = 0;
206     if (sizeof(T) * num != (retValueLen = parcel->ReadUint32())) {
207         DISPLAY_LOG(
208             "error: wrong data length of proxy received: %{public}u, expected: %{public}zu", retValueLen, sizeof(T));
209         return false;
210     }
211 
212     T *dataTmp = (T *)parcel->ReadUnpadBuffer(retValueLen);
213     if (dataTmp == nullptr) {
214         DISPLAY_LOG("read buffer data failed");
215         return false;
216     }
217     if (memcpy_s(data, num * sizeof(T), dataTmp, retValueLen) != EOK) {
218         return HDF_ERR_INVALID_PARAM;
219     }
220     return true;
221 }
222 
223 #endif // DISPLAY_DEVICE_COMMON_H
224