!867 fix: input driver create modify (linux and liteos)

Merge pull request !867 from chenpan0560/master
This commit is contained in:
openharmony_ci
2022-04-01 08:46:30 +00:00
committed by Gitee
11 changed files with 588 additions and 315 deletions
@@ -0,0 +1,206 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2022 Huawei Device Co., Ltd.
#
# HDF is dual licensed: you can use it either under the terms of
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import os
import sys
from string import Template
import hdf_utils
from hdf_tool_exception import HdfToolException
from .linux.kconfig_file_add_config import kconfig_file_operation
from .linux.mk_file_add_config import linux_makefile_operation
from .liteos.gn_file_add_config import build_file_operation
from .liteos.mk_file_add_config import makefile_file_operation
from ..hdf_command_error_code import CommandErrorCode
from ..hdf_defconfig_patch import HdfDefconfigAndPatch
from ..hdf_device_info_hcs import HdfDeviceInfoHcsFile
class HdfAddDriver(object):
def __init__(self, args):
super(HdfAddDriver, self).__init__()
self.module = args.module_name
self.board = args.board_name
self.driver = args.driver_name
self.kernel = args.kernel_name
self.vendor = args.vendor_name
self.root = args.root_dir
self.template_file_path = hdf_utils.get_template_file_path(self.root)
if not os.path.exists(self.template_file_path):
raise HdfToolException(
'template file: %s not exist' %
self.template_file_path, CommandErrorCode.TARGET_NOT_EXIST)
def add_linux(self, driver_file_path):
adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(
self.root, self.kernel)
hdf_utils.judge_file_path_exists(adapter_hdf)
adapter_model_path = os.path.join(adapter_hdf, 'model', self.module)
hdf_utils.judge_file_path_exists(adapter_model_path)
liteos_file_name = ['Makefile', 'Kconfig']
file_path = {}
for file_name in liteos_file_name:
if file_name == "Makefile":
build_file_path = os.path.join(adapter_model_path, file_name)
linux_makefile_operation(build_file_path, driver_file_path,
self.module, self.driver)
file_path['Makefile'] = build_file_path
elif file_name == "Kconfig":
kconfig_path = os.path.join(adapter_model_path, file_name)
kconfig_file_operation(kconfig_path, self.module,
self.driver, self.template_file_path)
file_path['Kconfig'] = kconfig_path
device_info = HdfDeviceInfoHcsFile(
self.root, self.vendor, self.module, self.board, self.driver, path="")
hcs_file_path = device_info.add_hcs_config_to_exists_model()
file_path["devices_info.hcs"] = hcs_file_path
template_string = "CONFIG_DRIVERS_HDF_${module_upper}_${driver_upper}=y\n"
data_model = {
"module_upper": self.module.upper(),
"driver_upper": self.driver.upper()
}
new_demo_config = Template(template_string).substitute(data_model)
defconfig_patch = HdfDefconfigAndPatch(
self.root, self.vendor, self.kernel, self.board,
data_model, new_demo_config)
config_path = defconfig_patch.get_config_config()
files = []
patch_list = defconfig_patch.add_module(config_path,
files=files, codetype=None)
config_path = defconfig_patch.get_config_patch()
files1 = []
defconfig_list = defconfig_patch.add_module(config_path,
files=files1, codetype=None)
file_path[self.module + "_dot_configs"] = \
list(set(patch_list + defconfig_list))
return file_path
def add_liteos(self, driver_file_path):
adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(
self.root, self.kernel)
hdf_utils.judge_file_path_exists(adapter_hdf)
adapter_model_path = os.path.join(adapter_hdf, 'model', self.module)
hdf_utils.judge_file_path_exists(adapter_model_path)
liteos_file_name = ['BUILD.gn', 'Makefile', 'Kconfig']
file_path = {}
for file_name in liteos_file_name:
if file_name == "BUILD.gn":
build_file_path = os.path.join(adapter_model_path, file_name)
build_file_operation(build_file_path, driver_file_path,
self.module, self.driver)
file_path['BUILD.gn'] = build_file_path
elif file_name == "Makefile":
makefile_path = os.path.join(adapter_model_path, file_name)
makefile_file_operation(makefile_path, driver_file_path,
self.module, self.driver)
file_path['Makefile'] = makefile_path
elif file_name == "Kconfig":
kconfig_path = os.path.join(adapter_model_path, file_name)
kconfig_file_operation(kconfig_path, self.module,
self.driver, self.template_file_path)
file_path['Kconfig'] = kconfig_path
# Modify hcs file
device_info = HdfDeviceInfoHcsFile(
self.root, self.vendor, self.module, self.board, self.driver, path="")
hcs_file_path = device_info.add_hcs_config_to_exists_model()
file_path["devices_info.hcs"] = hcs_file_path
dot_file_list = hdf_utils.get_dot_configs_path(
self.root, self.vendor, self.board)
template_string = "LOSCFG_DRIVERS_HDF_${module_upper}_${driver_upper}=y\n"
new_demo_config = Template(template_string).substitute(
{"module_upper": self.module.upper(),
"driver_upper": self.driver.upper()})
for dot_file in dot_file_list:
file_lines = hdf_utils.read_file_lines(dot_file)
file_lines[-1] = file_lines[-1].strip() + "\n"
if new_demo_config != file_lines[-1]:
file_lines.append(new_demo_config)
hdf_utils.write_file_lines(dot_file, file_lines)
file_path[self.module + "_dot_configs"] = dot_file_list
return file_path
def driver_create_info_format(self, config_file_json, config_item, file_path):
kernel_type = config_file_json.get(self.kernel)
if kernel_type is None:
config_file_json[self.kernel] = {
config_item.get("module_name"): {
'module_leve_config': {},
"driver_file_list": {
config_item.get("driver_name"): config_item.get("driver_file_path")
}
}
}
config_file_json[self.kernel][self.module]["module_leve_config"].update(file_path)
else:
model_type = kernel_type.get(config_item.get("module_name"))
if model_type is None:
temp = config_file_json.get(self.kernel)
temp_module = config_item.get("module_name")
temp[temp_module] = {
'module_leve_config': {},
"driver_file_list": {
config_item.get("driver_name"): config_item.get("driver_file_path")
}
}
config_file_json.get(self.kernel).get(self.module).get("module_leve_config").update(file_path)
else:
temp = config_file_json.get(self.kernel).\
get(config_item.get("module_name")).get("driver_file_list")
temp[config_item.get("driver_name")] = config_item.get("driver_file_path")
return config_file_json
def add_driver(self, *args_tuple):
root, vendor, module, driver, board, kernel = args_tuple
drv_converter = hdf_utils.WordsConverter(driver)
drv_src_dir = hdf_utils.get_drv_src_dir(root, module)
new_mkdir_path = os.path.join(drv_src_dir, driver)
if not os.path.exists(new_mkdir_path):
os.mkdir(new_mkdir_path)
data_model = {
'driver_lower_case': drv_converter.lower_case(),
'driver_upper_camel_case': drv_converter.upper_camel_case(),
'driver_lower_camel_case': drv_converter.lower_camel_case(),
'driver_upper_case': drv_converter.upper_case()
}
result_path = os.path.join(new_mkdir_path, '%s_driver.c' % driver)
if os.path.exists(result_path):
return True, result_path
self._file_gen_lite('hdf_driver.c.template', result_path, data_model)
result_path = os.path.join(new_mkdir_path, '%s_driver.c' % driver)
return True, result_path
def _file_gen_lite(self, template, source_file_path, model):
templates_dir = hdf_utils.get_templates_lite_dir()
template_path = os.path.join(templates_dir, template)
self._source_template_fill(template_path, source_file_path, model)
def _source_template_fill(self, template_path, output_path, data_model):
if not os.path.exists(template_path):
return
raw_content = hdf_utils.read_file(template_path)
contents = Template(raw_content).safe_substitute(data_model)
hdf_utils.write_file(output_path, contents)
@@ -0,0 +1,41 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2022 Huawei Device Co., Ltd.
#
# HDF is dual licensed: you can use it either under the terms of
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import os
from string import Template
import hdf_utils
from .mk_file_add_config import judge_driver_config_exists
def get_template_info(template_path):
template_path = os.path.join(template_path,
'driver_add_kconfig_config.template')
return hdf_utils.read_file(template_path)
def kconfig_file_operation(path, module, driver, template_path):
config_add_config = get_template_info(template_path)
kconfig_gn_path = path
date_lines = hdf_utils.read_file_lines(kconfig_gn_path)
judge_result = judge_driver_config_exists(date_lines, driver_name=driver)
if judge_result:
return
temp_handle = Template(config_add_config)
data = {
"model_name_upper": module.upper(),
"model_name_lower": module.lower(),
"driver_name_upper": driver.upper(),
"driver_name_lower": driver.lower()
}
new_line = temp_handle.substitute(data)
date_lines = date_lines + [new_line]
hdf_utils.write_file_lines(kconfig_gn_path, date_lines)
@@ -7,51 +7,64 @@
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import re
from string import Template
import hdf_utils
def replace_func(info_str):
replace_dict = {'(': "{", ')': "}"}
for key, values in replace_dict.items():
info_str = info_str.replace(key, values)
return info_str
def find_makefile_file_end_index(date_lines, model_name):
file_end_flag = "ccflags-y"
end_index = 0
# INPUT_ROOT_DIR info
model_dir_name = ("%s_ROOT_DIR" % model_name.upper())
model_dir_value = ""
def linux_makefile_operation(path, driver_file_path):
lines = hdf_utils.read_file_lines(path)
makefile_info = {}
for index, line in enumerate(lines):
if line.find('.o') != -1:
info_value = ('/'.join(line.split("=")[-1].split('/')[:-1])).strip()
if info_value not in list(makefile_info.values()):
makefile_info[index] = info_value
file_path = '/'.join(driver_file_path.split('\\'))
for key, info in makefile_info.items():
model_name = re.search(r"[A-Z_]+", info).group()
for line in lines:
if re.search(model_name, line):
temp = Template(replace_func(info))
temp_path = temp.safe_substitute({model_name: line.strip().split('=')[-1].strip()})
lines_insert(file_path, temp_path, lines, key)
break
hdf_utils.write_file_lines(path, lines)
def lines_insert(file_path, temp_path, lines, key):
insert_temp = ""
if file_path.find(temp_path.split('model')[-1]) != -1 and insert_temp == "":
insert_temp = lines[key]
if insert_temp.strip().endswith("\\"):
lines.insert(key + 1, re.sub(r"[a-zA-Z0-9_]+\.o", file_path.split('/')[-1].replace('.c', '.o'),
insert_temp))
for index, line in enumerate(date_lines):
if line.startswith("#"):
continue
elif line.strip().startswith(file_end_flag):
end_index = index
break
elif line.strip().startswith(model_dir_name):
model_dir_value = line.split("=")[-1].strip()
else:
test = (file_path.split('/')[-1] + r" \\")
lines.insert(key, re.sub(r"[a-zA-Z0-9_]+\.o", test.replace('.c', '.o'), insert_temp))
continue
result_tuple = (end_index, model_dir_name, model_dir_value)
return result_tuple
def linux_makefile_operation(path, driver_file_path, module, driver):
makefile_gn_path = path
date_lines = hdf_utils.read_file_lines(makefile_gn_path)
source_file_path = driver_file_path.replace('\\', '/')
result_tuple = find_makefile_file_end_index(date_lines, model_name=module)
judge_result = judge_driver_config_exists(date_lines, driver_name=driver)
if judge_result:
return
end_index, model_dir_name, model_dir_value = result_tuple
first_line = "\nobj-$(CONFIG_DRIVERS_HDF_${model_name_upper}_${driver_name_upper}) += \\ \n"
second_line = " $(${model_name_upper}_ROOT_DIR) /${source_file_path}\n"
makefile_add_template = first_line + second_line
include_model_info = model_dir_value.split("model")[-1].strip('"')+"/"
makefile_path_config = source_file_path.split(include_model_info)
temp_handle = Template(makefile_add_template.replace("$(", "temp_flag"))
d = {
'model_name_upper': module.upper(),
'driver_name_upper': driver.upper(),
'source_file_path': makefile_path_config[-1].replace(".c", ".o")
}
new_line = temp_handle.substitute(d).replace("temp_flag", "$(")
date_lines = date_lines[:end_index-1] + [new_line] + date_lines[end_index-1:]
hdf_utils.write_file_lines(makefile_gn_path, date_lines)
def judge_driver_config_exists(date_lines, driver_name):
for _, line in enumerate(date_lines):
if line.startswith("#"):
continue
elif line.find(driver_name) != -1:
return True
return False
@@ -7,62 +7,67 @@
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import ast
import re
import json
from string import Template
import hdf_utils
def build_file_operation(path, driver_file_path):
lines = hdf_utils.read_file_lines(path)
test_dict = {}
status = False
line_temp = ''
for index, line in enumerate(lines):
def find_build_file_end_index(date_lines, model_name):
state = False
end_index = 0
frameworks_model_name = "FRAMEWORKS_%s_ROOT" % (model_name.upper())
frameworks_model_value = ''
for index, line in enumerate(date_lines):
if line.startswith("#"):
pass
elif line.strip().startswith("sources"):
if line.split('=')[-1].find(']') != -1 and line.find("+=") == -1:
test_dict[index] = line
continue
elif line.find("hdf_driver") != -1:
state = True
continue
elif line.startswith("}") and state:
end_index = index
state = False
elif line.strip().startswith(frameworks_model_name):
frameworks_model_value = line.split("=")[-1].strip()
else:
if line.strip().startswith('FRAMEWORKS'):
test_dict[line.split('=')[0].strip()] = ast.literal_eval(line.split('=')[-1].strip())
elif line.find('$FRAMEWORKS') != -1 and \
line.find('.c') != -1 and \
status is False:
if line.strip()[1:-2].startswith('$FRAMEWORKS'):
line_temp = '/'.join((line.strip()[1:-2]).split('/')[:-1])
test_dict[index] = line_temp
status = True
elif line.find('$FRAMEWORKS') == -1:
line_temp = ''
status = False
elif line.find('$FRAMEWORKS') != -1 and \
line.find('.c') != -1 and line_temp:
if line.find(line_temp) == -1:
line_temp = '/'.join((line.strip()[1:-2]).split('/')[:-1])
test_dict[index] = line_temp
continue
result_tuple = (end_index, frameworks_model_name, frameworks_model_value)
return result_tuple
file_path = '/'.join(driver_file_path.split('\\'))
for i in test_dict.keys():
if isinstance(i, str):
pass
elif isinstance(i, int):
str1 = Template(test_dict.get(i))
source_file_path = str1.safe_substitute(test_dict)
if file_path.find("/".join(source_file_path.split("/")[1:])) != -1:
lines.insert(i + 1, re.sub(r'[a-zA-Z_0-9]+\.c', file_path.split('/')[-1], lines[i]))
elif source_file_path.strip().startswith("sources"):
temp_append_path = re.sub(r'[a-zA-Z_0-9]+\.c', file_path.split('/')[-1],
ast.literal_eval(lines[i].split('=')[-1])[0])
source_list = ast.literal_eval(lines[i].split('=')[-1])
source_list.append(temp_append_path)
result_str = json.dumps(source_list, indent=4)
temp_13 = (lines[i].split('=')[0] + "= " + result_str)
temp_13 = temp_13.replace("]", " ]")
lines[i] = temp_13
def build_file_operation(path, driver_file_path, module, driver):
hdf_utils.write_file_lines(path, lines)
build_gn_path = path
date_lines = hdf_utils.read_file_lines(build_gn_path)
source_file_path = driver_file_path.replace('\\', '/')
result_tuple = find_build_file_end_index(date_lines, model_name=module)
judge_result = judge_driver_config_exists(date_lines, driver_name=driver)
if judge_result:
return
end_index, frameworks_name, frameworks_value = result_tuple
first_line = "\n if (defined(LOSCFG_DRIVERS_HDF_${model_name_upper}_${driver_name_upper})) {\n"
second_line = ' sources += [ "$FRAMEWORKS_${model_name_upper}_ROOT/${source_file_path}" ]\n'
third_line = " }\n"
build_add_template = first_line + second_line + third_line
include_model_info = frameworks_value.split("model")[-1].strip('"')+"/"
build_gn_path_config = source_file_path.split(include_model_info)
temp_handle = Template(build_add_template.replace("$FRAMEWORKS", "FRAMEWORKS"))
d = {
'model_name_upper': module.upper(),
'driver_name_upper': driver.upper(),
'source_file_path': build_gn_path_config[-1]
}
new_line = temp_handle.substitute(d).replace("FRAMEWORKS", "$FRAMEWORKS")
date_lines = date_lines[:end_index] + [new_line] + date_lines[end_index:]
hdf_utils.write_file_lines(build_gn_path, date_lines)
def judge_driver_config_exists(date_lines, driver_name):
for _, line in enumerate(date_lines):
if line.startswith("#"):
continue
elif line.find(driver_name) != -1:
return True
return False
@@ -7,58 +7,56 @@
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import re
from string import Template
import hdf_utils
def replace_func(info_str):
replace_dict = {'(': "{", ')': "}"}
for key, values in replace_dict.items():
info_str = info_str.replace(key, values)
return info_str
from .gn_file_add_config import judge_driver_config_exists
def makefile_operation(mk_path, driver_file_path):
lines = hdf_utils.read_file_lines(mk_path)
makefile_info = {}
def find_makefile_file_end_index(date_lines, model_name):
file_end_flag = "include $(HDF_DRIVER)"
end_index = 0
model_dir_name = ("%s_ROOT_DIR" % model_name.upper())
model_dir_value = ""
status = False
for index, line in enumerate(lines):
if line.find('LOCAL_SRCS') != -1 and status == False:
status = True
if line.find("endif") != -1:
status = False
elif status:
info_value = ('/'.join(line.split("=")[-1].split('/')[:-1])).strip()
if info_value not in list(makefile_info.values()):
makefile_info[index] = info_value
file_path = '/'.join(driver_file_path.split('\\'))
for key, info in makefile_info.items():
if re.search(r"[A-Z_]+", info) is not None:
model_name = re.search(r"[A-Z_]+", info).group()
for line in lines:
if re.search(model_name, line):
temp = {model_name: line.strip().split('=')[-1].strip()}
temp_path = Template(replace_func(info)).safe_substitute(temp)
lines_insert(file_path, temp_path, lines, key)
hdf_utils.write_file_lines(mk_path, lines)
def lines_insert(file_path, temp_path, lines, key):
insert_temp = ""
if file_path.find(temp_path.split('model')[-1]) != -1 and insert_temp == "":
insert_temp = lines[key]
if insert_temp.strip().endswith("\\"):
replace_temp = re.sub(r"[a-zA-Z0-9_]+\.c", file_path.split('/')[-1], insert_temp)
if replace_temp.startswith("LOCAL_SRCS"):
insert_temp = ((len(replace_temp.split("=")[0]) + 1) * " ") + replace_temp.split("=")[-1]
lines.insert(key + 1, insert_temp)
else:
lines.insert(key + 1, replace_temp)
for index, line in enumerate(date_lines):
if line.startswith("#"):
continue
elif line.strip().startswith(file_end_flag):
end_index = index
elif line.strip().startswith(model_dir_name):
model_dir_value = line.split("=")[-1].strip()
else:
test = (file_path.split('/')[-1] + r" \\")
lines.insert(key, re.sub(r"[a-zA-Z0-9_]+.c$", test, insert_temp))
continue
result_tuple = (end_index, model_dir_name, model_dir_value)
return result_tuple
def makefile_file_operation(path, driver_file_path, module, driver):
makefile_gn_path = path
date_lines = hdf_utils.read_file_lines(makefile_gn_path)
judge_result = judge_driver_config_exists(date_lines, driver_name=driver)
if judge_result:
return
source_file_path = driver_file_path.replace('\\', '/')
result_tuple = find_makefile_file_end_index(date_lines, model_name=module)
end_index, model_dir_name, model_dir_value = result_tuple
first_line = "\nifeq ($(LOSCFG_DRIVERS_HDF_${model_name_upper}_${driver_name_upper}), y)\n"
second_line = "LOCAL_SRCS += $(${model_name_upper}_ROOT_DIR)/${source_file_path}\n"
third_line = "endif\n"
makefile_add_template = first_line + second_line + third_line
include_model_info = model_dir_value.split("model")[-1].strip('"')+"/"
makefile_path_config = source_file_path.split(include_model_info)
temp_handle = Template(makefile_add_template.replace("$(", "temp_flag"))
d = {
'model_name_upper': module.upper(),
'driver_name_upper': driver.upper(),
'source_file_path': makefile_path_config[-1]
}
new_line = temp_handle.substitute(d).replace("temp_flag", "$(")
date_lines = date_lines[:end_index-1] + [new_line] + date_lines[end_index-1:]
hdf_utils.write_file_lines(makefile_gn_path, date_lines)
@@ -6,15 +6,16 @@
# HDF is dual licensed: you can use it either under the terms of
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import copy
import os
import json
import platform
from string import Template
import hdf_utils
from hdf_tool_settings import HdfToolSettings
from hdf_tool_exception import HdfToolException
from .driver_add.hdf_add_driver import HdfAddDriver
from .hdf_command_handler_base import HdfCommandHandlerBase
from .hdf_command_error_code import CommandErrorCode
from .hdf_device_info_hcs import HdfDeviceInfoHcsFile
@@ -25,10 +26,6 @@ from .hdf_driver_config_file import HdfDriverConfigFile
from .hdf_vendor_makefile import HdfVendorMakeFile
from .hdf_defconfig_patch import HdfDefconfigAndPatch
from .driver_add.linux.mk_file_add_config import linux_makefile_operation
from .driver_add.liteos.gn_file_add_config import build_file_operation
from .driver_add.liteos.mk_file_add_config import makefile_operation
class HdfAddHandler(HdfCommandHandlerBase):
def __init__(self, args):
@@ -115,7 +112,7 @@ class HdfAddHandler(HdfCommandHandlerBase):
os.makedirs(framework_drv_root_dir)
# create .c template driver file
state, driver_file_path = self._add_driver(*args_tuple)
if not state:
raise HdfToolException(
@@ -175,29 +172,21 @@ class HdfAddHandler(HdfCommandHandlerBase):
'driver_file_path': driver_file_path,
'module_level_config_path': model_level_config_file_path
}
config_name = "create_model.config"
config_file = hdf_utils.read_file(
os.path.join('resources', 'create_model.config'))
os.path.join('resources', config_name))
config_file_json = json.loads(config_file)
config_file_json[module] = config_file_out
if platform.system() == "Windows":
config_file_replace = json.dumps(config_file_json, indent=4).\
replace(root.replace('\\', '\\\\') + '\\\\', "")
hdf_utils.write_file(
os.path.join('resources', 'create_model.config'),
config_file_replace.replace('\\\\', '/'))
if platform.system() == "Linux":
config_file_replace = json.dumps(config_file_json, indent=4).\
replace(root + '/', "")
hdf_utils.write_file(
os.path.join('resources', 'create_model.config'),
config_file_replace)
hdf_utils.write_config(root_path=root, config_file_json=config_file_json,
config_name=config_name)
return json.dumps(config_item)
else:
raise HdfToolException(
'supported boards name : %s not exits ' % board)
def _add_module_handler_liteos(self, framework_hdf, adapter_model_path,
data_model, converter, *args_tuple):
data_model, converter, *args_tuple):
root, vendor, module, driver, board, kernel = args_tuple
liteos_file_path = {}
liteos_level_config_file_path = {}
@@ -207,7 +196,7 @@ class HdfAddHandler(HdfCommandHandlerBase):
"resources", "templates", "lite"])
for file_name in liteos_file_name:
for i in hdf_utils.template_filename_filtrate(
template_path, kernel):
template_path, kernel):
if i.find(file_name.split(".")[0]) > 0:
out_path = os.path.join(adapter_model_path, file_name)
self._render(os.path.join(template_path, i),
@@ -217,7 +206,7 @@ class HdfAddHandler(HdfCommandHandlerBase):
# Modify Kconfig file
vendor_k = HdfVendorKconfigFile(root, vendor, kernel, path="")
vendor_k_path = vendor_k.add_module([module, 'Kconfig'])
liteos_level_config_file_path[module+"_Kconfig"] = vendor_k_path
liteos_level_config_file_path[module + "_Kconfig"] = vendor_k_path
# Modify hdf_lite.mk file
vendor_mk = HdfVendorMkFile(root, vendor)
@@ -338,15 +327,16 @@ class HdfAddHandler(HdfCommandHandlerBase):
template_path = "/".join([framework_hdf]
+ ["tools", "hdf_dev_eco_tool",
"resources", "templates", "lite"])
if platform.system() == "Windows":
driver_file_name = "//" + driver_file_path.strip(root).replace("\\", "/"),
elif platform.system() == "Linux":
driver_file_name = "//" + driver_file_path.strip(root).replace("\\", "/") + "c",
user_file_path = driver_file_path.split(root)[-1].replace("\\", "/")
if user_file_path.startswith("/"):
driver_file_name = "/" + user_file_path.replace("\\", "/")
else:
driver_file_name = "//" + driver_file_path.strip(root).replace("\\", "/"),
driver_file_name = "//" + user_file_path.replace("\\", "/")
data_model = {
"model_path": "//drivers/adapter/uhdf2/" + module,
"driver_file_name": driver_file_name[0],
"driver_file_name": driver_file_name,
"model_name": module,
}
for file_name in os.listdir(template_path):
@@ -412,28 +402,26 @@ class HdfAddHandler(HdfCommandHandlerBase):
common_dir_list = dir_dict.get("common")
if common_dir_list is not None:
if "src" in common_dir_list:
driver_file_path = os.path.join(drv_src_dir, "common",
"src", '%s_driver.c' % driver)
driver_file_path = os.path.join(drv_src_dir, "common", "src")
else:
driver_file_path = os.path.join(drv_src_dir, "common",
'%s_driver.c' % driver)
driver_file_path = os.path.join(drv_src_dir, "common")
else:
driver_file_path = os.path.join(drv_src_dir, '%s_driver.c' % driver)
driver_file_path = drv_src_dir
if os.path.exists(driver_file_path):
if not os.path.exists(driver_file_path):
raise HdfToolException(
'driver "%s" already exist' %
driver, CommandErrorCode.TARGET_ALREADY_EXIST)
'"%s" is path not exist' %
driver_file_path, CommandErrorCode.TARGET_NOT_EXIST)
data_model = {
'driver_lower_case': drv_converter.lower_case(),
'driver_upper_camel_case': drv_converter.upper_camel_case(),
'driver_lower_camel_case': drv_converter.lower_camel_case(),
'driver_upper_case': drv_converter.upper_case()
}
self._file_gen_lite('hdf_driver.c.template', drv_src_dir,
self._file_gen_lite('hdf_driver.c.template', driver_file_path,
'%s_driver.c' % driver, data_model)
return True, driver_file_path
result_path = os.path.join(driver_file_path, '%s_driver.c' % driver)
return True, result_path
def _add_driver_handler(self):
self.check_arg_raise_if_not_exist("vendor_name")
@@ -454,41 +442,13 @@ class HdfAddHandler(HdfCommandHandlerBase):
root, module)
hdf_utils.judge_file_path_exists(framework_drv_root_dir)
state, driver_file_path = self._add_driver(*args_tuple)
add_driver = HdfAddDriver(args=self.args)
state, driver_file_path = add_driver.add_driver(*args_tuple)
if board == "hispark_taurus":
adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(root, kernel)
hdf_utils.judge_file_path_exists(adapter_hdf)
adapter_model_path = os.path.join(adapter_hdf, 'model', module)
hdf_utils.judge_file_path_exists(adapter_model_path)
liteos_file_name = ['BUILD.gn', 'Makefile']
file_path = {}
for file_name in liteos_file_name:
if file_name == "BUILD.gn":
build_file_path = os.path.join(adapter_model_path, file_name)
build_file_operation(build_file_path, driver_file_path)
file_path['BUILD.gn'] = build_file_path
elif file_name == "Makefile":
makefile_path = os.path.join(adapter_model_path, file_name)
makefile_operation(makefile_path, driver_file_path)
file_path['Makefile'] = makefile_path
file_path = add_driver.add_liteos(driver_file_path)
elif board.endswith("linux"):
adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(root, kernel)
hdf_utils.judge_file_path_exists(adapter_hdf)
adapter_model_path = os.path.join(adapter_hdf, 'model', module)
hdf_utils.judge_file_path_exists(adapter_model_path)
liteos_file_name = ['Makefile']
file_path = {}
for file_name in liteos_file_name:
if file_name == "Makefile":
build_file_path = os.path.join(adapter_model_path, file_name)
linux_makefile_operation(build_file_path, driver_file_path)
file_path['Makefile'] = build_file_path
file_path = add_driver.add_linux(driver_file_path)
else:
file_path = []
@@ -499,51 +459,15 @@ class HdfAddHandler(HdfCommandHandlerBase):
'driver_file_path': driver_file_path,
'enabled': True
}
config_name = "create_driver.config"
config_file = hdf_utils.read_file(
os.path.join("resources", "create_driver.config"))
os.path.join("resources", config_name))
config_file_json = json.loads(config_file)
kernel_type = config_file_json.get(kernel)
if kernel_type is None:
config_file_json[kernel] = {
config_item.get("module_name"): {
'module_leve_config': {},
"driver_file_list": {
config_item.get("driver_name"): config_item.get("driver_file_path")
}
}
}
config_file_json[kernel][module]["module_leve_config"].update(file_path)
else:
model_type = kernel_type.get(config_item.get("module_name"))
if model_type is None:
temp = config_file_json.get(kernel)
temp_module = config_item.get("module_name")
temp[temp_module] = {
'module_leve_config': {},
"driver_file_list": {
config_item.get("driver_name"): config_item.get("driver_file_path")
}
}
config_file_json.get(kernel).get(module).get("module_leve_config").update(file_path)
else:
temp = config_file_json.get(kernel).\
get(config_item.get("module_name")).get("driver_file_list")
temp[config_item.get("driver_name")] = config_item.get("driver_file_path")
if platform.system() == "Windows":
config_file_replace = json.dumps(config_file_json, indent=4). \
replace(root.replace('\\', '\\\\') + '\\\\', "")
hdf_utils.write_file(
os.path.join('resources', 'create_driver.config'),
config_file_replace.replace('\\\\', '/'))
if platform.system() == "Linux":
config_file_replace = json.dumps(config_file_json, indent=4). \
replace(root + '/', "")
hdf_utils.write_file(
os.path.join('resources', 'create_driver.config'),
config_file_replace)
result_config_file_json = add_driver.driver_create_info_format(
config_file_json, config_item, file_path)
hdf_utils.write_config(root_path=root,
config_file_json=result_config_file_json,
config_name=config_name)
return config_item
def _add_config_handler(self):
@@ -66,45 +66,49 @@ class HdfDefconfigAndPatch(object):
path.split("/")[-1] in self.drivers_path_list:
files.append(path)
if codetype is None:
with open(path, "rb") as fread:
data = fread.readlines()
insert_index = None
state = False
for index, line in enumerate(data):
if line.find("CONFIG_DRIVERS_HDF_INPUT=y".encode('utf-8')) >= 0:
insert_index = index
elif line.find(self.new_demo_config.encode('utf-8')) >= 0:
files.remove(path)
state = True
if not state:
if path.split(".")[-1] != "patch":
data.insert(insert_index + 1,
self.new_demo_config.encode('utf-8'))
else:
data.insert(insert_index + 1,
("+" + self.new_demo_config).encode('utf-8'))
with open(path, "wb") as fwrite:
fwrite.writelines(data)
self.binary_type_write(path)
else:
with open(path, "r+", encoding=codetype) as fread:
data = fread.readlines()
insert_index = None
state = False
for index, line in enumerate(data):
if line.find("CONFIG_DRIVERS_HDF_INPUT=y") >= 0:
insert_index = index
elif line.find(self.new_demo_config) >= 0:
files.remove(path)
state = True
if not state:
if path.split(".")[-1] != "patch":
data.insert(insert_index + 1,
self.new_demo_config)
else:
data.insert(insert_index + 1,
"+" + self.new_demo_config)
with open(path, "w", encoding=codetype) as fwrite:
fwrite.writelines(data)
self.utf_type_write(path, codetype)
return files
def binary_type_write(self, path):
with open(path, "rb") as fread:
data = fread.readlines()
insert_index = None
state = False
for index, line in enumerate(data):
if line.find("CONFIG_DRIVERS_HDF_INPUT=y".encode('utf-8')) >= 0:
insert_index = index
elif line.find(self.new_demo_config.encode('utf-8')) >= 0:
state = True
if not state:
if path.split(".")[-1] != "patch":
data.insert(insert_index + 1,
self.new_demo_config.encode('utf-8'))
else:
data.insert(insert_index + 1,
("+" + self.new_demo_config).encode('utf-8'))
with open(path, "wb") as fwrite:
fwrite.writelines(data)
def utf_type_write(self, path, codetype):
with open(path, "r+", encoding=codetype) as fread:
data = fread.readlines()
insert_index = None
state = False
for index, line in enumerate(data):
if line.find("CONFIG_DRIVERS_HDF_INPUT=y") >= 0:
insert_index = index
elif line.find(self.new_demo_config) >= 0:
state = True
if not state:
if path.split(".")[-1] != "patch":
data.insert(insert_index + 1,
self.new_demo_config)
else:
data.insert(insert_index + 1,
"+" + self.new_demo_config)
with open(path, "w", encoding=codetype) as fwrite:
fwrite.writelines(data)
@@ -41,10 +41,17 @@ class HdfDeviceInfoHcsFile(object):
raise HdfToolException(
'hcs file: %s not exist' %
self.hcspath, CommandErrorCode.TARGET_NOT_EXIST)
self.data = {
"driver_name": self.driver,
"model_name": self.module,
}
def _save(self):
if self.lines:
hdf_utils.write_file(self.hcspath, ''.join(self.lines))
codetype = "utf-8"
with open(self.hcspath, "w+", encoding=codetype) as lwrite:
for line in self.lines:
lwrite.write(line)
def _find_line(self, pattern):
for index, line in enumerate(self.lines):
@@ -118,17 +125,13 @@ class HdfDeviceInfoHcsFile(object):
hdf_utils.read_file_lines(template_path)))
old_lines = list(filter(lambda x: x != "\n",
hdf_utils.read_file_lines(self.hcspath)))
new_data = old_lines[:-2] + lines + old_lines[-2:]
data = {
"driver_name": self.driver,
"model_name": self.module,
}
for index, _ in enumerate(new_data):
new_data[index] = Template(new_data[index]).substitute(data)
codetype = "utf-8"
with open(self.hcspath, "w+", encoding=codetype) as lwrite:
for j in new_data:
lwrite.write(j)
new_data[index] = Template(new_data[index]).substitute(self.data)
self.lines = new_data
self._save()
return self.hcspath
def add_model_hcs_file_config_user(self):
@@ -139,15 +142,59 @@ class HdfDeviceInfoHcsFile(object):
lines[-1] = "\t\t"+lines[-1].strip()+"\n"
old_lines = list(filter(lambda x: x != "\n",
hdf_utils.read_file_lines(self.hcspath)))
new_data = old_lines[:-2] + lines + old_lines[-2:]
data = {
"driver_name": self.driver,
"model_name": self.module,
}
for index, _ in enumerate(new_data):
new_data[index] = Template(new_data[index]).substitute(data)
codetype = "utf-8"
with open(self.hcspath, "w+", encoding=codetype) as lwrite:
for j in new_data:
lwrite.write(j)
new_data[index] = Template(new_data[index]).substitute(self.data)
self.lines = new_data
self._save()
return self.hcspath
def add_hcs_config_to_exists_model(self):
template_path = os.path.join(self.file_path,
'exists_model_hcs_info.template')
lines = list(map(lambda x: "\t\t\t" + x,
hdf_utils.read_file_lines(template_path)))
old_lines = list(filter(lambda x: x != "\n",
hdf_utils.read_file_lines(self.hcspath)))
end_index, start_index = self._get_model_index(old_lines)
model_hcs_lines = old_lines[start_index:end_index]
hcs_judge = self.judge_driver_hcs_exists(date_lines=model_hcs_lines)
if hcs_judge:
return self.hcspath
for index, _ in enumerate(lines):
lines[index] = Template(lines[index]).substitute(self.data)
self.lines = old_lines[:end_index] + lines + old_lines[end_index:]
self._save()
return self.hcspath
def _get_model_index(self, old_lines):
model_start_index = 0
model_end_index = 0
start_state = False
count = 0
for index, old_line in enumerate(old_lines):
if old_line.strip().startswith(self.module):
model_start_index = index
count += 1
start_state = True
else:
if start_state and old_line.find("{") != -1:
count += 1
elif start_state and old_line.find("}") != -1:
count -= 1
if count == 0:
start_state = False
model_end_index = index
return model_end_index, model_start_index
def judge_driver_hcs_exists(self, date_lines):
for _, line in enumerate(date_lines):
if line.startswith("#"):
continue
elif line.find(self.driver) != -1:
return True
return False
+20 -3
View File
@@ -11,7 +11,7 @@
import json
import os
import hashlib
import platform
from hdf_tool_exception import HdfToolException
from hdf_tool_settings import HdfToolSettings
@@ -362,5 +362,22 @@ def get_config_config_path(root, kernel):
def judge_file_path_exists(temp_path):
if not os.path.exists(temp_path):
raise HdfToolException('path "%s" not exist' %
temp_path, CommandErrorCode.TARGET_NOT_EXIST)
raise HdfToolException(
'path "%s" not exist' % temp_path,
CommandErrorCode.TARGET_NOT_EXIST)
def write_config(root_path, config_file_json, config_name):
if platform.system() == "Windows":
config_file_replace = json.dumps(config_file_json, indent=4). \
replace(root_path.replace('\\', '\\\\') + '\\\\', "")
write_file(os.path.join('resources', config_name),
config_file_replace.replace('\\\\', '/'))
if platform.system() == "Linux":
config_file_replace = json.dumps(config_file_json, indent=4). \
replace(root_path + '/', "")
write_file(os.path.join('resources', config_name),
config_file_replace)
@@ -0,0 +1,7 @@
config DRIVERS_HDF_${model_name_upper}_${driver_name_upper}
bool "Enable HDF ${model_name_lower} ${driver_name_lower} driver"
default n
depends on DRIVERS_HDF_${model_name_upper}
help
Answer Y to enable HDF ${model_name_lower} ${driver_name_lower} driver.
@@ -0,0 +1,11 @@
device_${model_name}_${driver_name} :: device { // Device node of sample
device0 :: deviceNode { // DeviceNode of the sample driver
policy = 2; // Driver service release policy. For details, see section Driver Service Management.
priority= 100; // Driver startup priority (0-200). A larger value indicates a lower priority. The default value 100 is recommended. If the priorities are the same, the device loading sequence is random.
preload = 0; // On-demand loading of the driver. For details, see "NOTE" at the end of this section.
permission = 0664; // Permission for the driver to create device nodes.
moduleName = "${driver_name}_driver"; // Driver name. The value of this field must be the same as the value of moduleName in the driver entry structure.
serviceName = "${driver_name}_service"; // Name of the service released by the driver. The name must be unique.
deviceMatchAttr = ""; // Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver.
}
}