| # Copyright 2016 The Chromium OS Authors. All rights reserved. |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # @ECLASS: arc-camera.eclass |
| # @BLURB: helper eclass for generating camera rules to use cameras under ARC. |
| # @DESCRIPTION: |
| # We want to generate camera rules automatically instead of adding the rules for |
| # every board manually. |
| |
| inherit udev |
| |
| # @FUNCTION: arc-camera_gen_and_install_rules |
| # @DESCRIPTION: |
| # Read camera_characteristics.conf. Then, generate 50-camera.rules based on |
| # camera id, vendor id as well as product id, and install the rules. |
| # The format of configuration file is |
| # "camera${CAMERA_ID}.module${MODULE_ID}.${ATTRIBUTE}=${VALUE}" |
| arc-camera_gen_and_install_rules() { |
| local config_file="${D}/etc/camera/camera_characteristics.conf" |
| local rules_file="${T}/50-camera.rules" |
| |
| if [[ ! -f "${config_file}" ]]; then |
| die "camera_characteristics.conf doesn't exist" |
| fi |
| |
| cat <<-EOF > "${rules_file}" |
| # Add a symbolic link for internal camera so the container can exclude external |
| # camera if needed. |
| EOF |
| local line |
| local -A vid_pid_table symlink_table usb_path_table |
| while read -r line; do |
| if [[ -z "${line}" || "${line}" == "#"* ]]; then |
| continue |
| fi |
| local camera="${line%%.*}" |
| local index="${line%.*}" |
| local symlink="${camera/camera/camera-internal}" |
| if [[ ${line} == *'usb_vid_pid'* ]]; then |
| # ${line} format: camera0.module0.usb_vid_pid=0a1b:2c3d |
| local vid_pid="${line#*=}" |
| vid_pid_table[${index}]="${vid_pid,,}" |
| symlink_table[${index}]="${symlink}" |
| elif [[ ${line} == *'usb_path'* ]]; then |
| # ${line} format: camera0.module0.usb_path=1-1 |
| local usb_path="${line#*=}" |
| usb_path_table[${index}]="${usb_path}" |
| symlink_table[${index}]="${symlink}" |
| elif [[ ${line} == *'camera1.lens_facing=1'* ]]; then |
| die "Second camera should be front camera" |
| fi |
| done < "${config_file}" |
| |
| local index |
| for index in "${!symlink_table[@]}"; do |
| local rules="" |
| if [[ -n "${vid_pid_table[${index}]}" ]]; then |
| rules+="SUBSYSTEM==\"video4linux\", ATTRS{idVendor}==\"\ |
| ${vid_pid_table[${index}]:0:4}\", ATTRS{idProduct}==\ |
| \"${vid_pid_table[${index}]:5:4}\"" |
| fi |
| if [[ -n "${usb_path_table[${index}]}" ]]; then |
| rules+=", KERNELS==\"${usb_path_table[${index}]}\"" |
| fi |
| rules+=", SYMLINK+=\"${symlink_table[${index}]}\"" |
| echo "${rules}" >> "${rules_file}" |
| done |
| |
| udev_dorules ${rules_file} |
| } |