[meta-freescale] Firmware loading

John Weber rjohnweber at gmail.com
Wed Mar 6 13:50:53 PST 2013

On 3/6/13 3:18 PM, Otavio Salvador wrote:
> On Wed, Mar 6, 2013 at 12:06 PM, John Weber <rjohnweber at gmail.com> wrote:
>> I'm attempting to configure Linux to load firmware for a Broadcom SDIO Wifi
>> chip (BCM4329) onto an i.MX6-based board.
>> Here is my main question - How is firmware supposed to be loaded within the
>> paradigm of a Yocto/Poky-built system?  Any insight and guidance is
>> appreciated.
>> What I've done so far, and what I've discovered:
>> I've incorporated the driver into the kernel (backported from an upstream
>> kernel rev), and removed the staging drivers present in 3.0.35.  It is
>> built-in at the moment (not a module) and this is the error that I'm getting
>> when it times-out loading firmware:
>> brcmfmac: brcmf_sdbrcm_download_code_file: Fail to request firmware -2
>> brcmfmac: _brcmf_sdbrcm_download_firmware: dongle image file download failed
>> brcmfmac: brcmf_bus_start: brcmf_sdbrcm_bus_init failed -1
>> The error code indicates that it cannot load firmware because it can't find
>> the firmware file.
>> I've taken care to put the firmware in /lib/firmware/brcm (2 files).  The
>> driver hardcodes a relative path filename to the firmware files and I've
>> made sure that they are the same.
>> I've researched the firmware request process for the kernel.  My
>> understanding is that the process looks like this:
>> 1) driver requests firmware file
>> 2) kernel opens up a special set of files in sysfs (/sys/class/firmware/xxx
>> where xxx is the device name)
>> 3) kernel signals udev to load firmware, giving it the filename and the
>> device name
>> 4) udev, through its rules, locates the firmware file for the device and
>> writes it to the special file in sysfs
>> So, here is where I'm starting to get confused.  The default udev rules that
>> are created in /lib/udev/rules.d/50-udev-default.rules show the following
>> rule for firmware:
>> SUBSYSTEM=="firmware", ACTION=="add", IMPORT{builtin}="firmware"
>> I'm guessing that this is for cases where the firmware file is built-in to
>> the kernel image.  I can see the necessity for doing this in some cases, but
>> that is not what I'm doing at the moment, I'm trying to load the firmware
>> from a file in the filesystem.  That requires udev to run a program or
>> script that will read the file and write it to the appropriate file in
>> sysfs.
>> The files in the poky udev recipe offers a clue, but for some reason that I
>> don't understand, this file does not make it into the filesystem:
>> poky/meta/recipes-core/udev/udev/udev.rules:
>> # Firmware Helper
>> ACTION=="add", SUBSYSTEM=="firmware", RUN+="/lib/udev/firmware.sh"
>> This rule expects that there is a firmware helper script "firmware.sh"
>> somewhere in the filesystem.  Other than this file, I can't file any
>> reference to a "firmware.sh" file anywhere in the metadata, which could
>> explain why this line doesn't make it into the installed filesystem.  I
>> could only find references to files named this on the net.
> This is danny or master? For danny, please check the version of udev
> being included as the udev maintained in meta-oe has some bugs but it
> is used by default.

I'm using master at the moment.  The version of udev is 182 in poky.

More information about the meta-freescale mailing list