• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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