Mike Frysinger | 4ed918e | 2012-05-09 15:44:12 -0400 | [diff] [blame] | 1 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | |
| 4 | # |
| 5 | # Original Author: The Chromium OS Authors <chromium-os-dev@chromium.org> |
| 6 | # Purpose: Install Gobi firmware for Chromium OS |
| 7 | # |
| 8 | |
| 9 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_OEM |
| 10 | # @DESCRIPTION: |
| 11 | # OEM name for firmware to install |
| 12 | : ${GOBI_FIRMWARE_OEM:=} |
| 13 | |
| 14 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_VID |
| 15 | # @DESCRIPTION: |
| 16 | # OEM Vendor ID |
| 17 | : ${GOBI_FIRMWARE_VID:=} |
| 18 | |
| 19 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_PID |
| 20 | # @DESCRIPTION: |
| 21 | # OEM Product ID |
| 22 | : ${GOBI_FIRMWARE_PID:=} |
| 23 | |
| 24 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_CARRIERS |
| 25 | # @DESCRIPTION: |
| 26 | # Install firmware for this list of carrier numbers |
| 27 | : ${GOBI_FIRMWARE_CARRIERS:=} |
| 28 | |
| 29 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_ZIP_FILE |
| 30 | # @DESCRIPTION: |
| 31 | # Filename of zip file containing firmware |
| 32 | : ${GOBI_FIRMWARE_ZIP_FILE:=} |
| 33 | |
| 34 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_FLAVOR |
| 35 | # @DESCRIPTION: |
| 36 | # The flavor (gps, xtra) to install |
| 37 | : ${GOBI_FIRMWARE_FLAVOR:="gps"} |
| 38 | |
| 39 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_QDL |
| 40 | # @DESCRIPTION: |
| 41 | # Install the qdl program from the firmware zip file |
| 42 | : ${GOBI_FIRMWARE_QDL:="no"} |
| 43 | |
| 44 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_DEFAULT_CARRIER |
| 45 | # @DESCRIPTION: |
| 46 | # Default carrier firmware to load if not set on modem |
| 47 | : ${GOBI_FIRMWARE_DEFAULT_CARRIER:=} |
| 48 | |
| 49 | # @ECLASS-VARIABLE: GOBI_FIRMWARE_APPS_DIR |
| 50 | # @DESCRIPTION: |
| 51 | # directory name for the .apps files |
| 52 | : ${GOBI_FIRMWARE_APPS_DIR:=""} |
| 53 | |
| 54 | GOBI_FIRMWARE_CARRIER_VOD=0 |
| 55 | GOBI_FIRMWARE_CARRIER_VZW=1 |
| 56 | GOBI_FIRMWARE_CARRIER_ATT=2 |
| 57 | GOBI_FIRMWARE_CARRIER_SPRINT=3 |
| 58 | GOBI_FIRMWARE_CARRIER_TMO=4 |
| 59 | GOBI_FIRMWARE_CARRIER_GEN=6 |
| 60 | GOBI_FIRMWARE_CARRIER_TELLFON=7 |
| 61 | GOBI_FIRMWARE_CARRIER_TELITAL=8 |
| 62 | GOBI_FIRMWARE_CARRIER_ORANGE=9 |
| 63 | GOBI_FIRMWARE_CARRIER_DOCO=12 |
| 64 | GOBI_FIRMWARE_CARRIER_DELLX=15 |
| 65 | GOBI_FIRMWARE_CARRIER_OMH=16 |
| 66 | |
Mike Frysinger | 4ed918e | 2012-05-09 15:44:12 -0400 | [diff] [blame] | 67 | # Check for EAPI 2+ |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 68 | case "${EAPI:-0}" in |
Mike Frysinger | 4ed918e | 2012-05-09 15:44:12 -0400 | [diff] [blame] | 69 | 4|3|2) ;; |
| 70 | *) die "unsupported EAPI" ;; |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 71 | esac |
| 72 | |
| 73 | gobi-firmware_install_udev_qcserial_rules() { |
| 74 | local oem=${GOBI_FIRMWARE_OEM} |
| 75 | local vid=${GOBI_FIRMWARE_VID} |
| 76 | local pid=${GOBI_FIRMWARE_PID} |
| 77 | local file=/etc/udev/rules.d/90-ttyusb-qcserial-${oem}.rules |
| 78 | cat > ${D}${file} <<EOF |
| 79 | # 90-ttyusb-qcserial-${oem}.rules |
| 80 | # Sets ownership of Gobi ttyusb devices belonging to qcserial. |
| 81 | |
| 82 | # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 83 | # Use of this source code is governed by a BSD-style license that can be |
| 84 | # found in the LICENSE file. |
| 85 | |
| 86 | ACTION!="add", GOTO="ttyusb_qcserial_${oem}_end" |
| 87 | SUBSYSTEM!="tty", GOTO="ttyusb_qcserial_${oem}_end" |
| 88 | KERNEL!="ttyUSB[0-9]*", GOTO="ttyusb_qcserial_${oem}_end" |
| 89 | |
| 90 | ATTRS{idVendor}=="${vid}", ATTRS{idProduct}=="${pid}", \ |
| 91 | OWNER="qdlservice", GROUP="qdlservice" |
| 92 | |
| 93 | LABEL="ttyusb_qcserial_${oem}_end" |
| 94 | |
| 95 | EOF |
| 96 | } |
| 97 | |
| 98 | gobi-firmware_install_udev_qdlservice_rules() { |
| 99 | local oem=${GOBI_FIRMWARE_OEM} |
| 100 | local vid=${GOBI_FIRMWARE_VID} |
| 101 | local pid=${GOBI_FIRMWARE_PID} |
| 102 | local file=/etc/udev/rules.d/99-qdlservice-${oem}.rules |
| 103 | cat > ${D}${file} <<EOF |
| 104 | # 99-qdlservice-${oem}.rules |
| 105 | # Emits a signal in response to a Gobi serial device appearing. Upstart will run |
| 106 | # QDLService when it sees this signal. |
| 107 | |
| 108 | # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 109 | # Use of this source code is governed by a BSD-style license that can be |
| 110 | # found in the LICENSE file. |
| 111 | |
| 112 | ACTION!="add", GOTO="qdlservice_${oem}_end" |
| 113 | SUBSYSTEM!="tty", GOTO="qdlservice_${oem}_end" |
| 114 | KERNEL!="ttyUSB[0-9]*", GOTO="qdlservice_${oem}_end" |
| 115 | |
| 116 | ATTRS{idVendor}=="${vid}", ATTRS{idProduct}=="${pid}", \ |
| 117 | RUN+="/sbin/initctl emit gobi_serial_${oem} GOBIDEV=/dev/%k" |
| 118 | |
| 119 | LABEL="qdlservice_${oem}_end" |
| 120 | EOF |
| 121 | } |
| 122 | |
| 123 | gobi-firmware_install_udev_rules() { |
| 124 | dodir /etc/udev/rules.d |
| 125 | gobi-firmware_install_udev_qcserial_rules |
| 126 | gobi-firmware_install_udev_qdlservice_rules |
| 127 | } |
| 128 | |
| 129 | gobi-firmware_install_upstart_scripts() { |
| 130 | dodir /etc/init |
| 131 | file=/etc/init/qdlservice-${GOBI_FIRMWARE_OEM}.conf |
| 132 | |
| 133 | cat > ${D}${file} <<EOF |
| 134 | |
| 135 | # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 136 | # Use of this source code is governed by a BSD-style license that can be |
| 137 | # found in the LICENSE file. |
| 138 | |
| 139 | # Starts QDLService if a Gobi ttyusb device appears. |
| 140 | |
| 141 | start on gobi_serial_${GOBI_FIRMWARE_OEM} |
| 142 | |
| 143 | script |
| 144 | set +e |
| 145 | GOBIQDL="/opt/Qualcomm/QDLService2k/QDLService2k${GOBI_FIRMWARE_OEM}" |
| 146 | ret=1 |
| 147 | attempt=0 |
| 148 | readonly MAX_ATTEMPTS=10 |
| 149 | while [ \$ret -ne 0 -a \$attempt -lt \$MAX_ATTEMPTS ]; do |
| 150 | # Exponential backoff - wait (2^attempt) - 1 seconds |
| 151 | sleep \$(((1 << \$attempt) - 1)) |
| 152 | starttime=\$(date +%s%N) |
Elly Jones | ee123c8 | 2011-09-22 16:48:48 -0400 | [diff] [blame] | 153 | /sbin/minijail0 -u qdlservice -g qdlservice -- "\$GOBIQDL" "\$GOBIDEV" |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 154 | ret=\$? |
| 155 | endtime=\$(date +%s%N) |
| 156 | logger -t qdlservice "attempt \$attempt: \$ret" |
| 157 | attempt=\$((\$attempt + 1)) |
Jason Glasgow | 6b57fa9 | 2011-06-14 17:54:03 -0400 | [diff] [blame] | 158 | if [ \$ret -ne 0 ]; then |
Jason Glasgow | 57d2076 | 2011-06-13 13:52:20 -0400 | [diff] [blame] | 159 | logger -t qdlservice "resetting..." |
| 160 | /opt/Qualcomm/bin/powercycle-all-gobis |
| 161 | fi |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 162 | done |
| 163 | download_time=\$(((\$endtime - \$starttime) / 1000000)) |
| 164 | METRICROOT=Network.3G.Gobi.FirmwareDownload |
| 165 | metrics_client \$METRICROOT.Time \$download_time 0 10000 20 |
| 166 | metrics_client -e \$METRICROOT.Attempts \$attempt \$MAX_ATTEMPTS |
| 167 | exit \$ret |
| 168 | end script |
| 169 | EOF |
| 170 | } |
| 171 | |
| 172 | gobi-firmware_install_firmware_files() { |
| 173 | local oem=${GOBI_FIRMWARE_OEM} |
| 174 | local install_qdl=${GOBI_FIRMWARE_QDL} |
| 175 | local apps_dir=${GOBI_FIRMWARE_APPS_DIR} |
| 176 | |
| 177 | # If the apps directory is not sepcified, then use the carrier |
| 178 | # directory. The apps directory should be set to UMTS for most |
| 179 | # UMTS carriers because they share the same firmware |
| 180 | if [ -z "${apps_dir}" ] ; then |
| 181 | apps_dir=${GOBI_FIRMWARE_DEFAULT_CARRIER} |
| 182 | fi |
| 183 | |
| 184 | # |
| 185 | # installation directories. |
| 186 | # We could consider installing to more standard locations |
| 187 | # except that QDLService expects to find files in |
| 188 | # /opt/Qualcomm. |
| 189 | # |
| 190 | local firmware_install_dir=${D}/opt/Qualcomm/Images2k |
| 191 | local qdl_install_dir=${D}/opt/Qualcomm/QDLService2k |
| 192 | local log_install_dir=${D}/var/log/ |
| 193 | local oemlog_filename=QDLService2k${oem}.txt |
| 194 | local log_filename=QDLService2k.txt |
| 195 | |
| 196 | if [ -d Images2k/${oem} ] ; then |
| 197 | # We already have the firmware extracted, this is easy |
| 198 | local base_firmware=Images2k/${oem} |
| 199 | |
| 200 | # Do not install qdl it will be build with SDK |
| 201 | install_qdl="no" |
| 202 | else |
| 203 | [ -z "${GOBI_FIRMWARE_ZIP_FILE}" ] && \ |
| 204 | die "Must specify GOBI_FIRMWARE_ZIP_FILE" |
| 205 | [ ! -r "${GOBI_FIRMWARE_ZIP_FILE}" ] && \ |
| 206 | die "${GOBI_FIRMWARE_ZIP_FILE} is unreadable" |
Jason Glasgow | 40673e7 | 2011-03-11 02:22:26 -0500 | [diff] [blame] | 207 | mkdir -p "${T}/${oem}" |
| 208 | unzip ${GOBI_FIRMWARE_ZIP_FILE} -d "${T}/${oem}" |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 209 | |
Jason Glasgow | 40673e7 | 2011-03-11 02:22:26 -0500 | [diff] [blame] | 210 | if [ -d "${T}/${oem}/Images2k/${oem}" ] ; then |
| 211 | local base_firmware="${T}/${oem}/Images2k/${oem}" |
| 212 | install_qdl=no |
| 213 | else |
| 214 | rpmfile=$(find "${T}/${oem}" -name \*.rpm -print) |
| 215 | [ -z $rpmfile ] && |
| 216 | die "Could not find an RPM file in ${GOBI_FIRMWARE_ZIP_FILE}" |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 217 | |
Jason Glasgow | 40673e7 | 2011-03-11 02:22:26 -0500 | [diff] [blame] | 218 | # extract the rpm |
| 219 | if [ -d ${oem}_rpm ] ; then |
| 220 | rm -rf ${oem}_rpm |
| 221 | fi |
| 222 | mkdir -p ${oem}_rpm |
| 223 | rpm2tar -O $rpmfile | tar -C ${oem}_rpm -xvf - |
| 224 | |
| 225 | local base_firmware=${oem}_rpm/opt/Qualcomm/Images2k/${oem} |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 226 | fi |
Jason Glasgow | 8db519d | 2011-01-26 17:29:07 -0500 | [diff] [blame] | 227 | fi |
| 228 | |
| 229 | # make directories |
| 230 | install -d ${firmware_install_dir}/${oem} \ |
| 231 | ${qdl_install_dir} ${udev_rules_install_dir} |
| 232 | |
| 233 | # install firmware |
| 234 | local flavor_firmware=${base_firmware}_${GOBI_FIRMWARE_FLAVOR} |
| 235 | for carrier in ${GOBI_FIRMWARE_CARRIERS} UMTS ; do |
| 236 | # copy the base firmware |
| 237 | cp -af ${base_firmware}/${carrier} ${firmware_install_dir}/${oem} |
| 238 | if [ -d ${flavor_firmware}/${carrier} ] ; then |
| 239 | # overlay spefic xtra/gps flavor files |
| 240 | cp -af ${flavor_firmware}/${carrier} ${firmware_install_dir}/${oem} |
| 241 | fi |
| 242 | done |
| 243 | |
| 244 | # Copy DID file for this device |
| 245 | cp ${base_firmware}/*.did ${firmware_install_dir}/${oem} |
| 246 | |
| 247 | # Create a DID file for generic GOBI devices |
| 248 | did_file=$(ls ${base_firmware}/*.did | head -n1) |
| 249 | if [ ! -x $did_file ] ; then |
| 250 | # TODO(jglasgow): Move code for 05c6920b to dogfood ebuild |
| 251 | cp $did_file ${firmware_install_dir}/${oem}/05c6920b.did |
| 252 | fi |
| 253 | |
| 254 | # Set firmware and directory permissions |
| 255 | find ${firmware_install_dir}/${oem} -type f -exec chmod 444 {} \; |
| 256 | find ${firmware_install_dir}/${oem} -type d -exec chmod 555 {} \; |
| 257 | |
| 258 | # install firmware download program, and associated files |
| 259 | if [ ${install_qdl} == "yes" ] ; then |
| 260 | local qdl_dir=${oem}_rpm/opt/Qualcomm/QDLService2k |
| 261 | install -t ${qdl_install_dir} \ |
| 262 | ${qdl_dir}/QDLService2k${oem} |
| 263 | |
| 264 | ln -sf /opt/Qualcomm/QDLService2k/QDLService2k${oem} \ |
| 265 | ${qdl_install_dir}/QDLService2kGeneric |
| 266 | fi |
| 267 | |
| 268 | # Ensure the default firmware files exists and create Options${oem}.txt |
| 269 | local image_dir=/opt/Qualcomm/Images2k/${oem} |
| 270 | local amss_file=${image_dir}/${apps_dir}/amss.mbn |
| 271 | local apps_file=${image_dir}/${apps_dir}/apps.mbn |
| 272 | local uqcn_file=${image_dir}/${GOBI_FIRMWARE_DEFAULT_CARRIER}/uqcn.mbn |
| 273 | for file in $amss_file $apps_file $uqcn_file ; do |
| 274 | if [ ! -r ${D}${file} ] ; then |
| 275 | die "Could not find file: $file in ${D}" |
| 276 | fi |
| 277 | done |
| 278 | |
| 279 | cat > Options2k${oem}.txt <<EOF |
| 280 | ${amss_file} |
| 281 | ${apps_file} |
| 282 | ${uqcn_file} |
| 283 | EOF |
| 284 | install -t ${qdl_install_dir} Options2k${oem}.txt |
| 285 | } |
| 286 | |
| 287 | gobi-firmware_src_install() { |
| 288 | # Verify that eclass variables are set |
| 289 | [ -z "${GOBI_FIRMWARE_DEFAULT_CARRIER}" ] && \ |
| 290 | die "Must specify GOBI_FIRMWARE_DEFAULT_CARRIER" |
| 291 | [ -z "${GOBI_FIRMWARE_OEM}" ] && \ |
| 292 | die "Must specify GOBI_FIRMWARE_OEM" |
| 293 | [ -z "${GOBI_FIRMWARE_VID}" ] && \ |
| 294 | die "Must specify GOBI_FIRMWARE_VID" |
| 295 | [ -z "${GOBI_FIRMWARE_PID}" ] && \ |
| 296 | die "Must specify GOBI_FIRMWARE_PID" |
| 297 | [ -z "${GOBI_FIRMWARE_CARRIERS}" ] && |
| 298 | die "Must specify GOBI_FIRMWARE_CARRIERS" |
| 299 | |
| 300 | gobi-firmware_install_udev_rules |
| 301 | gobi-firmware_install_upstart_scripts |
| 302 | gobi-firmware_install_firmware_files |
| 303 | } |
| 304 | |
| 305 | EXPORT_FUNCTIONS src_install |