1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "codegen/c_service_driver_code_emitter.h"
10 #include "util/file.h"
11 #include "util/logger.h"
12 #include "util/options.h"
13
14 namespace OHOS {
15 namespace HDI {
CServiceDriverCodeEmitter()16 CServiceDriverCodeEmitter::CServiceDriverCodeEmitter() : CCodeEmitter(), hostName_("host")
17 {
18 }
19
ResolveDirectory(const std::string & targetDirectory)20 bool CServiceDriverCodeEmitter::ResolveDirectory(const std::string &targetDirectory)
21 {
22 if (ast_->GetASTFileType() != ASTFileType::AST_IFACE) {
23 return false;
24 }
25
26 directory_ = GetFileParentPath(targetDirectory);
27 if (!File::CreateParentDir(directory_)) {
28 Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.c_str());
29 return false;
30 }
31
32 return true;
33 }
34
EmitCode()35 void CServiceDriverCodeEmitter::EmitCode()
36 {
37 switch (mode_) {
38 case GenMode::LOW: {
39 EmitLowDriverSourceFile();
40 break;
41 }
42 case GenMode::IPC: {
43 if (!interface_->IsSerializable()) {
44 EmitDriverSourceFile();
45 }
46 break;
47 }
48 case GenMode::KERNEL: {
49 EmitDriverSourceFile();
50 break;
51 }
52 default:
53 break;
54 }
55 }
56
EmitLowDriverSourceFile()57 void CServiceDriverCodeEmitter::EmitLowDriverSourceFile()
58 {
59 std::string filePath =
60 File::AdapterPath(StringHelper::Format("%s/%s.c", directory_.c_str(), FileName(baseName_ + "Driver").c_str()));
61 File file(filePath, File::WRITE);
62 StringBuilder sb;
63
64 EmitLicense(sb);
65 sb.Append("\n");
66 EmitLowDriverInclusions(sb);
67 sb.Append("\n");
68 EmitLogTagMacro(sb, FileName(baseName_ + "Driver"));
69 sb.Append("\n");
70 EmitLowDriverBind(sb);
71 sb.Append("\n");
72 EmitDriverInit(sb);
73 sb.Append("\n");
74 EmitLowDriverRelease(sb);
75 sb.Append("\n");
76 EmitDriverEntryDefinition(sb);
77
78 std::string data = sb.ToString();
79 file.WriteData(data.c_str(), data.size());
80 file.Flush();
81 file.Close();
82 }
83
EmitLowDriverInclusions(StringBuilder & sb) const84 void CServiceDriverCodeEmitter::EmitLowDriverInclusions(StringBuilder &sb) const
85 {
86 HeaderFile::HeaderFileSet headerFiles;
87 headerFiles.emplace(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(implName_));
88 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_core_log");
89 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc");
90
91 for (const auto &file : headerFiles) {
92 sb.AppendFormat("%s\n", file.ToString().c_str());
93 }
94 }
95
EmitLowDriverBind(StringBuilder & sb) const96 void CServiceDriverCodeEmitter::EmitLowDriverBind(StringBuilder &sb) const
97 {
98 sb.AppendFormat("static int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
99 sb.Append("{\n");
100 sb.Append(TAB).Append("HDF_LOGI(\"%s: driver bind start\", __func__);\n");
101 sb.Append(TAB).AppendFormat("struct %s *serviceImpl = %sGet();\n", implName_.c_str(), implName_.c_str());
102 sb.Append(TAB).Append("if (serviceImpl == NULL) {\n");
103 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%s: failed to get service impl\", __func__);\n");
104 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
105 sb.Append(TAB).Append("}\n");
106 sb.Append(TAB).Append("deviceObject->service = &serviceImpl->super.service;\n");
107 sb.Append(TAB).Append("return HDF_SUCCESS;\n");
108 sb.Append("}\n");
109 }
110
EmitLowDriverRelease(StringBuilder & sb) const111 void CServiceDriverCodeEmitter::EmitLowDriverRelease(StringBuilder &sb) const
112 {
113 sb.AppendFormat("static void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
114 sb.Append("{\n");
115 sb.Append(TAB).Append("HDF_LOGI(\"%s: driver release start\", __func__);\n");
116
117 sb.Append(TAB).Append("if (deviceObject == NULL || deviceObject->service == NULL) {\n");
118 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%s: invalid device object\", __func__);\n");
119 sb.Append(TAB).Append(TAB).Append("return;\n");
120 sb.Append(TAB).Append("}\n\n");
121 sb.Append(TAB).AppendFormat(
122 "struct %s *serviceImpl = (struct %s *)deviceObject->service;\n", implName_.c_str(), implName_.c_str());
123 sb.Append(TAB).Append("if (serviceImpl != NULL) {\n");
124 sb.Append(TAB).Append(TAB).AppendFormat("%sRelease(serviceImpl);\n", implName_.c_str());
125 sb.Append(TAB).Append("}\n");
126 sb.Append("}\n");
127 }
128
EmitDriverSourceFile()129 void CServiceDriverCodeEmitter::EmitDriverSourceFile()
130 {
131 std::string filePath =
132 File::AdapterPath(StringHelper::Format("%s/%s.c", directory_.c_str(), FileName(baseName_ + "Driver").c_str()));
133 File file(filePath, File::WRITE);
134 StringBuilder sb;
135
136 EmitLicense(sb);
137 EmitDriverInclusions(sb);
138 sb.Append("\n");
139 EmitLogTagMacro(sb, FileName(baseName_ + "Driver"));
140 sb.Append("\n");
141 EmitDriverServiceDecl(sb);
142 sb.Append("\n");
143 if (mode_ == GenMode::KERNEL) {
144 EmitKernelDriverDispatch(sb);
145 sb.Append("\n");
146 EmitDriverInit(sb);
147 sb.Append("\n");
148 EmitKernelDriverBind(sb);
149 sb.Append("\n");
150 EmitKernelDriverRelease(sb);
151 } else {
152 EmitDriverDispatch(sb);
153 sb.Append("\n");
154 EmitDriverInit(sb);
155 sb.Append("\n");
156 EmitDriverBind(sb);
157 sb.Append("\n");
158 EmitDriverRelease(sb);
159 }
160 sb.Append("\n");
161 EmitDriverEntryDefinition(sb);
162
163 std::string data = sb.ToString();
164 file.WriteData(data.c_str(), data.size());
165 file.Flush();
166 file.Close();
167 }
168
EmitDriverInclusions(StringBuilder & sb)169 void CServiceDriverCodeEmitter::EmitDriverInclusions(StringBuilder &sb)
170 {
171 HeaderFile::HeaderFileSet headerFiles;
172
173 if (mode_ == GenMode::KERNEL) {
174 headerFiles.emplace(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(implName_));
175 } else {
176 headerFiles.emplace(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_));
177 }
178
179 GetDriverSourceOtherLibInclusions(headerFiles);
180
181 for (const auto &file : headerFiles) {
182 sb.AppendFormat("%s\n", file.ToString().c_str());
183 }
184 }
185
GetDriverSourceOtherLibInclusions(HeaderFile::HeaderFileSet & headerFiles) const186 void CServiceDriverCodeEmitter::GetDriverSourceOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles) const
187 {
188 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base");
189 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_core_log");
190 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem");
191 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc");
192 if (mode_ != GenMode::KERNEL) {
193 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_object");
194 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_remote_service");
195 headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "stub_collector");
196 }
197 }
198
EmitDriverServiceDecl(StringBuilder & sb) const199 void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder &sb) const
200 {
201 sb.AppendFormat("struct Hdf%sHost {\n", baseName_.c_str());
202 sb.Append(TAB).AppendFormat("struct IDeviceIoService ioService;\n");
203 if (mode_ == GenMode::KERNEL) {
204 sb.Append(TAB).AppendFormat("struct %s *service;\n", implName_.c_str());
205 } else {
206 sb.Append(TAB).AppendFormat("struct %s *service;\n", interfaceName_.c_str());
207 sb.Append(TAB).Append("struct HdfRemoteService **stubObject;\n");
208 }
209 sb.Append("};\n");
210 }
211
EmitKernelDriverDispatch(StringBuilder & sb)212 void CServiceDriverCodeEmitter::EmitKernelDriverDispatch(StringBuilder &sb)
213 {
214 sb.AppendFormat(
215 "static int32_t %sDriverDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", baseName_.c_str());
216 sb.Append(TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n");
217 sb.Append("{\n");
218 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(\n", baseName_.c_str(), hostName_.c_str());
219 sb.Append(TAB).Append(TAB).AppendFormat(
220 "client->device->service, struct Hdf%sHost, ioService);\n", baseName_.c_str());
221 sb.Append(TAB).AppendFormat("if (%s->service == NULL || %s->service->stub.OnRemoteRequest == NULL) {\n",
222 hostName_.c_str(), hostName_.c_str());
223 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: invalid service obj\", __func__);\n");
224 sb.Append(TAB).Append(TAB).Append("return HDF_ERR_INVALID_OBJECT;\n");
225 sb.Append(TAB).Append("}\n\n");
226 sb.Append(TAB).AppendFormat("return %s->service->stub.OnRemoteRequest(", hostName_.c_str());
227 sb.AppendFormat("&%s->service->stub.interface, cmdId, data, reply);\n", hostName_.c_str());
228 sb.Append("}\n");
229 }
230
EmitDriverDispatch(StringBuilder & sb)231 void CServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder &sb)
232 {
233 sb.AppendFormat(
234 "static int32_t %sDriverDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", baseName_.c_str());
235 sb.Append(TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n");
236 sb.Append("{\n");
237 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.c_str(), hostName_.c_str());
238 sb.AppendFormat("client->device->service, struct Hdf%sHost, ioService);\n", baseName_.c_str());
239 sb.Append(TAB).AppendFormat("if (%s->service == NULL || %s->stubObject == NULL) {\n",
240 hostName_.c_str(), hostName_.c_str());
241 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: invalid service obj\", __func__);\n");
242 sb.Append(TAB).Append(TAB).Append("return HDF_ERR_INVALID_OBJECT;\n");
243 sb.Append(TAB).Append("}\n\n");
244 sb.Append(TAB).AppendFormat("struct HdfRemoteService *stubObj = *%s->stubObject;\n", hostName_.c_str());
245 sb.Append(TAB).AppendFormat("if (stubObj == NULL || stubObj->dispatcher == NULL || ");
246 sb.Append("stubObj->dispatcher->Dispatch == NULL) {\n");
247 sb.Append(TAB).Append(TAB).Append("return HDF_ERR_INVALID_OBJECT;\n");
248 sb.Append(TAB).Append("}\n\n");
249 sb.Append(TAB).Append("return stubObj->dispatcher->Dispatch(");
250 sb.Append("(struct HdfRemoteService *)stubObj->target, cmdId, data, reply);\n");
251 sb.Append("}\n");
252 }
253
EmitDriverInit(StringBuilder & sb) const254 void CServiceDriverCodeEmitter::EmitDriverInit(StringBuilder &sb) const
255 {
256 sb.AppendFormat("static int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
257 sb.Append("{\n");
258 if (mode_ == GenMode::LOW) {
259 sb.Append(TAB).Append("HDF_LOGI(\"%s: driver init start\", __func__);\n");
260 } else {
261 sb.Append(TAB).Append("HDF_LOGI(\"%{public}s: driver init start\", __func__);\n");
262 }
263 sb.Append(TAB).Append("return HDF_SUCCESS;\n");
264 sb.Append("}\n");
265 }
266
EmitKernelDriverBind(StringBuilder & sb)267 void CServiceDriverCodeEmitter::EmitKernelDriverBind(StringBuilder &sb)
268 {
269 sb.AppendFormat("static int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
270 sb.Append("{\n");
271 sb.Append(TAB).Append("HDF_LOGI(\"%{public}s: driver bind start\", __func__);\n");
272 sb.Append("\n");
273
274 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemCalloc(", baseName_.c_str(),
275 hostName_.c_str(), baseName_.c_str());
276 sb.AppendFormat("sizeof(struct Hdf%sHost));\n", baseName_.c_str());
277 sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", hostName_.c_str());
278 sb.Append(TAB).Append(TAB).AppendFormat(
279 "HDF_LOGE(\"Hdf%sDriverBind create Hdf%sHost object failed!\");\n", baseName_.c_str(), baseName_.c_str());
280 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
281 sb.Append(TAB).Append("}\n");
282 sb.Append("\n");
283 sb.Append(TAB).AppendFormat("%s->ioService.Dispatch = %sDriverDispatch;\n", hostName_.c_str(), baseName_.c_str());
284 sb.Append(TAB).AppendFormat("%s->ioService.Open = NULL;\n", hostName_.c_str());
285 sb.Append(TAB).AppendFormat("%s->ioService.Release = NULL;\n", hostName_.c_str());
286 sb.Append(TAB).AppendFormat("%s->service = %sServiceGet();\n", hostName_.c_str(), baseName_.c_str());
287 sb.Append(TAB).AppendFormat("if (%s->service == NULL) {\n", hostName_.c_str());
288 sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(%s);\n", hostName_.c_str());
289 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: failed to get service object\", __func__);\n");
290 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
291 sb.Append(TAB).Append("}\n");
292 sb.Append("\n");
293 sb.Append(TAB).AppendFormat("deviceObject->service = &%s->ioService;\n", hostName_.c_str());
294 sb.Append(TAB).Append("return HDF_SUCCESS;\n");
295 sb.Append("}\n");
296 }
297
EmitDriverBind(StringBuilder & sb)298 void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder &sb)
299 {
300 sb.AppendFormat("static int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
301 sb.Append("{\n");
302 sb.Append(TAB).Append("HDF_LOGI(\"%{public}s: driver bind start\", __func__);\n");
303 sb.Append(TAB).AppendFormat("int32_t ret = HdfDeviceObjectSetInterfaceDesc(deviceObject, %s);\n",
304 interface_->EmitDescMacroName().c_str());
305 sb.Append(TAB).Append("if (ret != HDF_SUCCESS) {\n");
306 sb.Append(TAB).Append(TAB).Append(
307 "HDF_LOGE(\"%{public}s: failed to set interface descriptor of device object\", __func__);\n");
308 sb.Append(TAB).Append(TAB).Append("return ret;\n");
309 sb.Append(TAB).Append("}\n\n");
310
311 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemCalloc(", baseName_.c_str(),
312 hostName_.c_str(), baseName_.c_str());
313 sb.AppendFormat("sizeof(struct Hdf%sHost));\n", baseName_.c_str());
314 sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", hostName_.c_str());
315 sb.Append(TAB).Append(TAB).AppendFormat("HDF_LOGE(\"%%{public}s: create Hdf%sHost object failed!\", __func__);\n",
316 baseName_.c_str());
317 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
318 sb.Append(TAB).Append("}\n\n");
319 sb.Append(TAB).AppendFormat("struct %s *serviceImpl = %sGet(true);\n", interfaceName_.c_str(),
320 interfaceName_.c_str());
321 sb.Append(TAB).Append("if (serviceImpl == NULL) {\n");
322 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: create serviceImpl failed!\", __func__);\n");
323 sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(%s);\n", hostName_.c_str());
324 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
325 sb.Append(TAB).Append("}\n\n");
326 sb.Append(TAB).AppendFormat("struct HdfRemoteService **stubObj = StubCollectorGetOrNewObject(");
327 sb.AppendFormat("%s, serviceImpl);\n", interface_->EmitDescMacroName().c_str());
328 sb.Append(TAB).Append("if (stubObj == NULL) {\n");
329 sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: failed to get stub object\", __func__);\n");
330 sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(%s);\n", hostName_.c_str());
331 sb.Append(TAB).Append(TAB).AppendFormat("%sRelease(serviceImpl, true);\n", interfaceName_.c_str());
332 sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n");
333 sb.Append(TAB).Append("}\n\n");
334
335 sb.Append(TAB).AppendFormat("%s->ioService.Dispatch = %sDriverDispatch;\n", hostName_.c_str(), baseName_.c_str());
336 sb.Append(TAB).AppendFormat("%s->ioService.Open = NULL;\n", hostName_.c_str());
337 sb.Append(TAB).AppendFormat("%s->ioService.Release = NULL;\n", hostName_.c_str());
338 sb.Append(TAB).AppendFormat("%s->service = serviceImpl;\n", hostName_.c_str());
339 sb.Append(TAB).AppendFormat("%s->stubObject = stubObj;\n", hostName_.c_str());
340 sb.Append(TAB).AppendFormat("deviceObject->service = &%s->ioService;\n", hostName_.c_str());
341 sb.Append(TAB).Append("return HDF_SUCCESS;\n");
342 sb.Append("}\n");
343 }
344
EmitKernelDriverRelease(StringBuilder & sb)345 void CServiceDriverCodeEmitter::EmitKernelDriverRelease(StringBuilder &sb)
346 {
347 sb.AppendFormat("static void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
348 sb.Append("{\n");
349 sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", baseName_.c_str());
350 sb.Append(TAB).Append("HDF_LOGI(\"%{public}s: driver release start\", __func__);\n");
351 sb.Append(TAB).Append(TAB).Append("return;\n");
352 sb.Append(TAB).Append("}\n\n");
353 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.c_str(), hostName_.c_str());
354 sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioService);\n", baseName_.c_str());
355 sb.Append(TAB).AppendFormat("if (%s != NULL) {\n", hostName_.c_str());
356 sb.Append(TAB).Append(TAB).AppendFormat("%sServiceRelease(%s->service);\n", baseName_.c_str(), hostName_.c_str());
357 sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(%s);\n", hostName_.c_str());
358 sb.Append(TAB).Append("}\n");
359 sb.Append("}\n");
360 }
361
EmitDriverRelease(StringBuilder & sb)362 void CServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder &sb)
363 {
364 sb.AppendFormat("static void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", baseName_.c_str());
365 sb.Append("{\n");
366 sb.Append(TAB).Append("HDF_LOGI(\"%{public}s: driver release start\", __func__);\n");
367
368 sb.Append(TAB).Append("if (deviceObject->service == NULL) {\n");
369 sb.Append(TAB).Append(TAB).Append("return;\n");
370 sb.Append(TAB).Append("}\n\n");
371
372 sb.Append(TAB).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.c_str(), hostName_.c_str());
373 sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioService);\n", baseName_.c_str());
374 sb.Append(TAB).AppendFormat("if (%s != NULL) {\n", hostName_.c_str());
375 sb.Append(TAB).Append(TAB).AppendFormat("StubCollectorRemoveObject(%s, %s->service);\n",
376 interface_->EmitDescMacroName().c_str(), hostName_.c_str());
377 sb.Append(TAB).Append(TAB).AppendFormat("%sRelease(%s->service, true);\n", interfaceName_.c_str(),
378 hostName_.c_str());
379 sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(%s);\n", hostName_.c_str());
380 sb.Append(TAB).Append("}\n");
381 sb.Append("}\n");
382 }
383
EmitDriverEntryDefinition(StringBuilder & sb) const384 void CServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder &sb) const
385 {
386 sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", StringHelper::StrToLower(baseName_).c_str());
387 sb.Append(TAB).Append(".moduleVersion = 1,\n");
388 sb.Append(TAB).AppendFormat(".moduleName = \"%s\",\n", Options::GetInstance().GetPackage().c_str());
389 sb.Append(TAB).AppendFormat(".Bind = Hdf%sDriverBind,\n", baseName_.c_str());
390 sb.Append(TAB).AppendFormat(".Init = Hdf%sDriverInit,\n", baseName_.c_str());
391 sb.Append(TAB).AppendFormat(".Release = Hdf%sDriverRelease,\n", baseName_.c_str());
392 sb.Append("};\n\n");
393 sb.AppendFormat("HDF_INIT(g_%sDriverEntry);\n", StringHelper::StrToLower(baseName_).c_str());
394 }
395 } // namespace HDI
396 } // namespace OHOS