Enabling virtual cape at boot?

This forum is for supported devices using an ARMv7 Texas Instruments (TI) SoC.

Enabling virtual cape at boot?

Postby vaizki » Tue Jul 02, 2013 10:23 pm

I've copy pasted / modded a "virtual" cape for the BBB to enable one wire bus on a GPIO pin. So it has a .dtbo in /lib/firmware/BB-W1-00A0.dtbo and I can enable it after boot with:

$this->bbcode_second_pass_code('', 'echo BB-W1:00A0 > /sys/devices/bone_capemgr.8/slots')
Now to enable it automatically at boot, the capemanager can be told to enable it by putting this into uEnv.txt:

$this->bbcode_second_pass_code('', 'optargs=capemgr.enable_partno=BB-W1')

However it's not working and when I check dmesg, I see (edited for brevity):

$this->bbcode_second_pass_code('', '
[ 0.000000] Kernel command line: console=ttyO0,115200n8 capemgr.enable_partno=BB-W1 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait fixrtc
...
[ 0.558466] bone-capemgr bone_capemgr.8: Baseboard: 'A335BNLT,0A5C,2413BBBK1579'
[ 0.558510] bone-capemgr bone_capemgr.8: compatible-baseboard=ti,beaglebone-black
[ 0.588543] bone-capemgr bone_capemgr.8: slot #0: No cape found
[ 0.625649] bone-capemgr bone_capemgr.8: slot #1: No cape found
[ 0.662755] bone-capemgr bone_capemgr.8: slot #2: No cape found
[ 0.699866] bone-capemgr bone_capemgr.8: slot #3: No cape found
[ 0.706132] bone-capemgr bone_capemgr.8: slot #4: specific override
[ 0.706175] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot
4
[ 0.706204] bone-capemgr bone_capemgr.8: slot #4: 'Bone-LT-eMMC-2G,00A0,Texas Ins
trument,BB-BONE-EMMC-2G'
[ 0.706347] bone-capemgr bone_capemgr.8: slot #5: specific override
[ 0.706383] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot
5
[ 0.706410] bone-capemgr bone_capemgr.8: slot #5: 'Bone-Black-HDMI,00A0,Texas Ins
trument,BB-BONELT-HDMI'
[ 0.706533] bone-capemgr bone_capemgr.8: slot #6: specific override
[ 0.706567] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot
6
[ 0.706595] bone-capemgr bone_capemgr.8: slot #6: 'Bone-Black-HDMIN,00A0,Texas In
strument,BB-BONELT-HDMIN'
[ 0.706739] bone-capemgr bone_capemgr.8: enabled_partno part_number 'BB-W1', version 'N/A'
[ 0.706769] bone-capemgr bone_capemgr.8: slot #7: generic override
[ 0.706791] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 7
[ 0.706817] bone-capemgr bone_capemgr.8: slot #7: 'Override Board Name,00A0,Override Manuf,BB-W1'
[ 0.707384] bone-capemgr bone_capemgr.8: loader: before slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[ 0.707412] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[ 0.707557] bone-capemgr bone_capemgr.8: loader: before slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[ 0.707582] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[ 0.707786] bone-capemgr bone_capemgr.8: loader: before slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[ 0.707812] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[ 0.707880] bone-capemgr bone_capemgr.8: initialized OK.
[ 0.709916] OneNAND driver initializing
[ 0.711225] usbcore: registered new interface driver cdc_ether
[ 0.711317] usbcore: registered new interface driver rndis_host
[ 0.711490] usbcore: registered new interface driver cdc_ncm
[ 0.711665] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[ 0.711724] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[ 0.711763] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[ 0.711801] bone-capemgr bone_capemgr.8: loader: before slot-7 BB-W1:00A0 (prio 0)
[ 0.711823] bone-capemgr bone_capemgr.8: loader: check slot-7 BB-W1:00A0 (prio 0)
[ 0.711848] bone-capemgr bone_capemgr.8: loader: after slot-7 BB-W1:00A0 (prio 0)
[ 0.711874] bone-capemgr bone_capemgr.8: slot #7: Requesting part number/version based 'BB-W1-00A0.dtbo
[ 0.711903] bone-capemgr bone_capemgr.8: slot #7: Requesting firmware 'BB-W1-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
')
At this point the kernel loads a bunch of drivers including USB storage, ethernet etc etc.. and then:

$this->bbcode_second_pass_code('', '[ 0.861565] Waiting for root device /dev/mmcblk0p2...
[ 60.750828] bone-capemgr bone_capemgr.8: failed to load firmware 'BB-W1-00A0.dtbo'
[ 60.758822] bone-capemgr bone_capemgr.8: loader: failed to load slot-7 BB-W1:00A0 (prio 0)
')

So clearly it can't get to /lib/firmware before root is mounted. Notice the 60 second timeout there as well which doesn't happen before I modded uEnv.txt. But other "virtual capes" load fine:

$this->bbcode_second_pass_code('', '
[ 60.767542] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[ 60.767573] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[ 60.767589] bone-capemgr bone_capemgr.8: loader: after slot-5 BB-BONELT-HDMI:00A0 (prio 1)
[ 60.767616] bone-capemgr bone_capemgr.8: slot #5: Requesting firmware 'cape-boneblack-hdmi-00A0.dtbo' for board-name 'Bone-Black-HDMI', version '00A0'
[ 60.767640] bone-capemgr bone_capemgr.8: slot #5: dtbo 'cape-boneblack-hdmi-00A0.dtbo' loaded; converting to live tree
[ 60.767998] bone-capemgr bone_capemgr.8: slot #5: #4 overlays
[ 60.769152] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[ 60.769177] bone-capemgr bone_capemgr.8: loader: after slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
[ 60.769198] bone-capemgr bone_capemgr.8: slot #4: Requesting firmware 'cape-bone-2g-emmc1.dtbo' for board-name 'Bone-LT-eMMC-2G', version '00A0'
[ 60.769214] bone-capemgr bone_capemgr.8: slot #4: dtbo 'cape-bone-2g-emmc1.dtbo' loaded; converting to live tree
[ 60.769764] bone-capemgr bone_capemgr.8: slot #4: #2 overlays
')

I guess the dtbo blobs are combiled into the standard linux-am33x 3.8.13-5 package which is why they can be loaded? After all this the root filesystem is mounted but too late. I checked in the Ångström demo image that the BBB comes with, what happens is that when the firmware is requested it not only loads usb mass storage etc stuff but also mounts the root filesystem so it can get to /lib/firmware.

Now my question is: How do I get my own DTBO loaded at boot? Roll it into the kernel or modify something so that they can be loaded from the root filesystem?

And yes, I know I can make a systemd unit for it in this case but for some other i2c/spi drivers I'd probably want them to be loaded by the kernel.
vaizki
 
Posts: 7
Joined: Tue Jul 02, 2013 9:38 pm

Re: Enabling virtual cape at boot?

Postby pepedog » Tue Jul 02, 2013 11:30 pm

pepedog
Developer
 
Posts: 2431
Joined: Mon Jun 07, 2010 3:30 pm
Location: London UK

Re: Enabling virtual cape at boot?

Postby vaizki » Tue Jul 09, 2013 5:20 pm

$this->bbcode_second_pass_quote('pepedog', 'T')emporary files might do it
https://wiki.archlinux.org/index.php/Systemd#Temporary_files


Thanks, that's an interesting workaround... Right now it's looking a bit like I'm just going to roll my own systemd units anyway and worry about in-kernel activation when I need it.
vaizki
 
Posts: 7
Joined: Tue Jul 02, 2013 9:38 pm


Return to Texas Instruments (TI)

Who is online

Users browsing this forum: No registered users and 22 guests