blob: eac2b2dbbda9a96d82046216bc15dd370674b47b [file] [log] [blame]
Mike Frysinger4ed918e2012-05-09 15:44:12 -04001# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Jason Glasgow8db519d2011-01-26 17:29:07 -05002# 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
54GOBI_FIRMWARE_CARRIER_VOD=0
55GOBI_FIRMWARE_CARRIER_VZW=1
56GOBI_FIRMWARE_CARRIER_ATT=2
57GOBI_FIRMWARE_CARRIER_SPRINT=3
58GOBI_FIRMWARE_CARRIER_TMO=4
59GOBI_FIRMWARE_CARRIER_GEN=6
60GOBI_FIRMWARE_CARRIER_TELLFON=7
61GOBI_FIRMWARE_CARRIER_TELITAL=8
62GOBI_FIRMWARE_CARRIER_ORANGE=9
63GOBI_FIRMWARE_CARRIER_DOCO=12
64GOBI_FIRMWARE_CARRIER_DELLX=15
65GOBI_FIRMWARE_CARRIER_OMH=16
66
Mike Frysinger4ed918e2012-05-09 15:44:12 -040067# Check for EAPI 2+
Jason Glasgow8db519d2011-01-26 17:29:07 -050068case "${EAPI:-0}" in
Mike Frysinger4ed918e2012-05-09 15:44:12 -040069 4|3|2) ;;
70 *) die "unsupported EAPI" ;;
Jason Glasgow8db519d2011-01-26 17:29:07 -050071esac
72
73gobi-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
86ACTION!="add", GOTO="ttyusb_qcserial_${oem}_end"
87SUBSYSTEM!="tty", GOTO="ttyusb_qcserial_${oem}_end"
88KERNEL!="ttyUSB[0-9]*", GOTO="ttyusb_qcserial_${oem}_end"
89
90ATTRS{idVendor}=="${vid}", ATTRS{idProduct}=="${pid}", \
91 OWNER="qdlservice", GROUP="qdlservice"
92
93LABEL="ttyusb_qcserial_${oem}_end"
94
95EOF
96}
97
98gobi-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
112ACTION!="add", GOTO="qdlservice_${oem}_end"
113SUBSYSTEM!="tty", GOTO="qdlservice_${oem}_end"
114KERNEL!="ttyUSB[0-9]*", GOTO="qdlservice_${oem}_end"
115
116ATTRS{idVendor}=="${vid}", ATTRS{idProduct}=="${pid}", \
117 RUN+="/sbin/initctl emit gobi_serial_${oem} GOBIDEV=/dev/%k"
118
119LABEL="qdlservice_${oem}_end"
120EOF
121}
122
123gobi-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
129gobi-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
141start on gobi_serial_${GOBI_FIRMWARE_OEM}
142
143script
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 Jonesee123c82011-09-22 16:48:48 -0400153 /sbin/minijail0 -u qdlservice -g qdlservice -- "\$GOBIQDL" "\$GOBIDEV"
Jason Glasgow8db519d2011-01-26 17:29:07 -0500154 ret=\$?
155 endtime=\$(date +%s%N)
156 logger -t qdlservice "attempt \$attempt: \$ret"
157 attempt=\$((\$attempt + 1))
Jason Glasgow6b57fa92011-06-14 17:54:03 -0400158 if [ \$ret -ne 0 ]; then
Jason Glasgow57d20762011-06-13 13:52:20 -0400159 logger -t qdlservice "resetting..."
160 /opt/Qualcomm/bin/powercycle-all-gobis
161 fi
Jason Glasgow8db519d2011-01-26 17:29:07 -0500162 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
168end script
169EOF
170}
171
172gobi-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 Glasgow40673e72011-03-11 02:22:26 -0500207 mkdir -p "${T}/${oem}"
208 unzip ${GOBI_FIRMWARE_ZIP_FILE} -d "${T}/${oem}"
Jason Glasgow8db519d2011-01-26 17:29:07 -0500209
Jason Glasgow40673e72011-03-11 02:22:26 -0500210 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 Glasgow8db519d2011-01-26 17:29:07 -0500217
Jason Glasgow40673e72011-03-11 02:22:26 -0500218 # 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 Glasgow8db519d2011-01-26 17:29:07 -0500226 fi
Jason Glasgow8db519d2011-01-26 17:29:07 -0500227 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}
283EOF
284 install -t ${qdl_install_dir} Options2k${oem}.txt
285}
286
287gobi-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
305EXPORT_FUNCTIONS src_install