| # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # Check for EAPI 4+ |
| case "${EAPI:-0}" in |
| 4|5|6) ;; |
| *) die "unsupported EAPI (${EAPI}) in eclass (${ECLASS})" ;; |
| esac |
| |
| # @ECLASS-VARIABLE: UNIBOARD_CROS_CONFIG_DIR |
| # @DESCRIPTION: |
| # This is the installation directory of cros-config data. |
| UNIBOARD_CROS_CONFIG_DIR="/usr/share/chromeos-config" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_DTB_INSTALL_PATH |
| # @DESCRIPTION: |
| # This is the filename of the master configuration for use with doins. |
| UNIBOARD_DTB_INSTALL_PATH="${UNIBOARD_CROS_CONFIG_DIR}/config.dtb" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_JSON_INSTALL_PATH |
| # @DESCRIPTION: |
| # This is the filename of the master configuration for use with doins. |
| UNIBOARD_JSON_INSTALL_PATH="${UNIBOARD_CROS_CONFIG_DIR}/config.json" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_DTS_DIR |
| # @DESCRIPTION: |
| # This is the installation directory of the device-tree source files. |
| UNIBOARD_DTS_DIR="${UNIBOARD_CROS_CONFIG_DIR}/dts" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_DTS_BASEBOARD |
| # @DESCRIPTION: |
| # This is a shared file that can be installed by a baseboard ebuild and shared |
| # among various overlays. Commonly used for sharing SKU's. |
| UNIBOARD_DTS_BASEBOARD="${CROS_MODELS_DIR}/baseboard/model.dtsi" |
| # TODO(jclinton): Support YAML joining of files |
| |
| # @ECLASS-VARIABLE: UNIBOARD_YAML_DIR |
| # @DESCRIPTION: |
| # This is the installation directory of the yaml source files. |
| UNIBOARD_YAML_DIR="${UNIBOARD_CROS_CONFIG_DIR}/yaml" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_YAML_CONFIG |
| # @DESCRIPTION: |
| # This is the installation path to the YAML source file. |
| UNIBOARD_YAML_CONFIG="${UNIBOARD_YAML_DIR}/config.yaml" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_C_CONFIG |
| # @DESCRIPTION: |
| # This is the installation path to the C source file. |
| UNIBOARD_C_CONFIG="${UNIBOARD_YAML_DIR}/config.c" |
| |
| # @ECLASS-VARIABLE: UNIBOARD_CROS_CONFIG_FILES_DIR |
| # @DESCRIPTION: |
| # This is the installation directory of files referenced in the model.dtsi. |
| UNIBOARD_CROS_CONFIG_FILES_DIR="/usr/share/chromeos-config/files" |
| |
| # @FUNCTION: _unibuild_find_configs |
| # @USAGE: [directory] [extension] |
| # @INTERNAL |
| # @DESCRIPTION: |
| # Find .dtsi/.yaml files in a given directory tree. |
| # Args: |
| # $1: Directory to search. |
| # $2: Extension to search for (.dtsi or .yaml) |
| # Returns: |
| # Exports a 'files' variable containing the array of files found. |
| _unibuild_find_configs() { |
| local file |
| |
| while read -d $'\0' -r file; do |
| files+=( "${file}" ) |
| done < <(find "$1" -name "*$2" -print0) |
| } |
| |
| # @FUNCTION: _install_model_files |
| # @USAGE: [prefix] |
| # @INTERNAL |
| # @DESCRIPTION: |
| # Find .dtsi/.yaml files in a given directory tree. |
| # Install model files with a given prefix: |
| # Args: |
| # $1: Prefix to use (either "" or "private-") |
| _install_model_files() { |
| [[ $# -eq 1 ]] || die "${FUNCNAME}: takes one arguments" |
| |
| local prefix="$1" |
| local files |
| |
| _unibuild_find_configs "${FILESDIR}" ".dtsi" |
| if [ -n "$files" ]; then |
| files=() |
| # Support a shared base file that can be imported from a baseboard ebuild |
| if [[ -e "${SYSROOT}/${UNIBOARD_DTS_BASEBOARD}" ]]; then |
| files+=( "${SYSROOT}/${UNIBOARD_DTS_BASEBOARD}" ) |
| fi |
| _unibuild_find_configs "${FILESDIR}" ".dtsi" |
| |
| |
| einfo "Validating ${#files[@]} files:" |
| validate_config -p "${files[@]}" || die "Validation failed" |
| |
| einfo "Installing ${#files[@]} files to ${UNIBOARD_DTS_DIR}" |
| |
| # Avoid polluting callers with our newins. |
| ( |
| insinto "${UNIBOARD_DTS_DIR}" |
| for file in "${files[@]}"; do |
| local dest="${file%/*}" |
| dest="${prefix}${dest##*/}.dtsi" |
| |
| einfo "Installing ${dest}" |
| newins "${file}" "${dest}" |
| done |
| ) |
| fi |
| |
| |
| files=() |
| _unibuild_find_configs "${FILESDIR}" ".yaml" |
| |
| if [ -n "$files" ]; then |
| einfo "Installing ${#files[@]} files to ${UNIBOARD_YAML_DIR}" |
| |
| # Avoid polluting callers with our newins. |
| ( |
| insinto "${UNIBOARD_YAML_DIR}" |
| for file in "${files[@]}"; do |
| local dest="${file%/*}" |
| dest="${prefix}${dest##*/}.yaml" |
| |
| einfo "Installing ${dest}" |
| newins "${file}" "${dest}" |
| done |
| ) |
| fi |
| } |
| |
| # @FUNCTION: install_private_model_files |
| # @USAGE: |
| # @DESCRIPTION: |
| # Installs all .dtsi files for the current board. This is intended to be called |
| # from the chromeos-config-<board> private ebuild. The files are named |
| # "private-<fname>.dtsi". |
| install_private_model_files() { |
| [[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments" |
| |
| _install_model_files "private-" |
| } |
| |
| # @FUNCTION: install_model_files |
| # @USAGE: |
| # @DESCRIPTION: |
| # Installs all .dtsi files for the current board. This is intended to be called |
| # from the chromeos-config-<board> public ebuild. The files are named |
| # "<fname>.dtsi". |
| install_model_files() { |
| [[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments" |
| |
| _install_model_files "" |
| } |
| |
| # @FUNCTION: cros_config_host_local |
| # @USAGE: |
| # @DESCRIPTION: |
| # Invokes cros_config_host using the config directly from |
| # chromeos-config-bsp/files |
| # Args: |
| # $1: Command to pass to cros_config_host |
| cros_config_host_local() { |
| # This function is called before FILESDIR is set so figure it out from |
| # the ebuild filename. |
| local basedir="$(dirname "${EBUILD}")/.." |
| local configdir="${basedir}/chromeos-config-bsp/files" |
| local files |
| |
| if [[ -d "${configdir}" ]]; then |
| if [[ -e "${configdir}/model.yaml" ]]; then |
| echo $(cros_config_host -c "${configdir}/model.yaml" "$1") |
| else |
| # We are not allowed to access the ROOT directory here, so compile the |
| # model fragment on the fly and pull out the value we want. |
| _unibuild_find_configs "${configdir}" ".dtsi" |
| echo $(echo "/dts-v1/; / { chromeos { family: family { }; " \ |
| "models: models { }; }; };" | |
| cat "-" "${files[@]}" | |
| dtc -O dtb -Wno-unit_address_vs_reg | |
| cros_config_host -c - "$1") |
| fi |
| else |
| # We cannot die here if there are no config files as this function is |
| # called by non-unibuild boards. We just need to output an empty |
| # config. But do skip this if there is no config BSP directory at all. |
| echo "" |
| fi |
| } |
| |
| # @FUNCTION: _unibuild_common_install |
| # @USAGE: [command] |
| # @INTERNAL |
| # @DESCRIPTION: |
| # Common installation function. |
| # Install files from a relative path in FILESDIR to an absolute path in the |
| # root. |
| # Args: |
| # $1: Command to pass to cros_config_host to get the files |
| _unibuild_common_install() { |
| [[ $# -eq 1 ]] || die "${FUNCNAME}: takes one argument" |
| |
| local cmd="$1" |
| local source dest origfile |
| (cros_config_host "${cmd}" || die) | |
| while read -r source; do |
| read -r dest |
| einfo " - ${source}" |
| insinto "$(dirname "${dest}")" |
| # From EAPI4+ symbolic links are not dereferenced when |
| # installing, but we want to dereference our links when |
| # installing config files. Common config files may be linked |
| # in the source directory, but the installed file should not be |
| # a link especially since the installed folder structure is |
| # different. |
| origfile="$(readlink -f "${FILESDIR}/${source}")" |
| newins "${origfile}" "$(basename "${dest}")" |
| done |
| } |
| |
| # @FUNCTION: unibuild_install_thermal_files |
| # @USAGE: |
| # @DESCRIPTION: |
| # Install files related to thermal operation. Currently this is only the DPTF |
| # (Dynamic Platform and Thermal Framework) datavaults, typically called dptf.dv |
| unibuild_install_thermal_files() { |
| [[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments" |
| |
| einfo "unibuild: Installing thermal files" |
| _unibuild_common_install get-thermal-files |
| } |
| |
| # @FUNCTION: _unibuild_install_fw |
| # @USAGE: [source] [dest] [symlink path] |
| # @INTERNAL |
| # @DESCRIPTION: |
| # Install touch firmware and create a symlink for 'request firmware' hotplug. |
| # $1: Source filename |
| # $2: Destination filename (in /opt/google) |
| # $3: Full path to symlink in /lib/firmware |
| _unibuild_install_fw() { |
| local source="$1" |
| local dest="$2" |
| local symlink="$3" |
| |
| elog " - ${source} with symlink from ${symlink}" |
| insinto "$(dirname "${dest}")" |
| doins "${source}" |
| dosym "${dest}" "${symlink}" |
| } |
| |
| # @FUNCTION: unibuild_install_touch_files |
| # @USAGE: |
| # @DESCRIPTION: |
| # Install files related to touch firmware. This includes firmware for the |
| # touchscreen, touchpad and stylus. |
| unibuild_install_touch_files() { |
| einfo "unibuild: Installing touch files" |
| set -o pipefail |
| cros_config_host get-touch-firmware-files | |
| ( while read -r source; do |
| read -r dest |
| read -r symlink |
| _unibuild_install_fw "${FILESDIR}/${source}" "${dest}" "${symlink}" |
| done ) || die "Failed to read config" |
| } |
| |
| # @FUNCTION: unibuild_install_audio_files |
| # @USAGE: |
| # @DESCRIPTION: |
| # Install files related to audio. This includes cras, alsa and hotwording |
| # topology firmware. |
| unibuild_install_audio_files() { |
| [[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments" |
| |
| einfo "unibuild: Installing audio files" |
| _unibuild_common_install get-audio-files |
| } |
| |
| # @FUNCTION: unibuild_install_arc_files |
| # @USAGE: |
| # @DESCRIPTION: Install files related to arc++. |
| unibuild_install_arc_files() { |
| [[ $# -eq 0 ]] || die "${FUNCNAME}: takes no arguments" |
| |
| einfo "unibuild: Installing arc++ files" |
| local source dest |
| (cros_config_host get-arc-files || die) | |
| while read -r source; do |
| read -r dest |
| einfo " - ${source}" |
| insinto "$(dirname "${dest}")" |
| newins "${FILESDIR}/${source}" "$(basename "${dest}")" |
| chmod 755 "${D}/${dest}" |
| done |
| } |