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