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