Monday 5 December 2016

Bash Completion on OS X

Working with the terminal in OS X for the first time I realised I was missing tab completion for common terminal tasks.  After a bit of searching I found the bash-completion package is available to install from brew.  Just use:

brew install bash-completion

Friday 9 September 2016

No SIM card - Emergency calls only

I got a Motorola Google Nexus 6 phone which takes a nano SIM card.  I cut down my existing SIM as far as I could and it worked in the Nexus but the SIM tray wouldn't shut properly so I ordered a brand new nano SIM.

When the nano SIM came I could not get it to work at all.  The phone would not detect the presence of the SIM card.  I tried wedging paper under it, cleaning contacts, factory reset, software downgrade and nothing would work.

This same nano SIM worked perfectly in another handset, I tried another working nano SIM in the Nexus and that wouldn't work either.

I then tried pushing the SIM tray as hard as I could and surprisingly the SIM was registered by the handset and it indicated full signal.

Short Answer:
Push the SIM tray in as hard as you can!!!

This appears to be some kind of mechanical defect with the Nexus 6 as recorded in many threads.
Here: http://forum.xda-developers.com/nexus-6/help/sim-card-emergency-calls-error-verizon-t2996291
Here: https://productforums.google.com/forum/#!topic/nexus/wuIXWFdaHZQ
And Here: https://productforums.google.com/forum/#!topic/nexus/-vSXPn2obNk

Monday 15 August 2016

Best description so far of Google Cast API

Thinking of developing a Google Cast Receiver outside of the official Android SDK?

Take a look at this documentation

Tuesday 8 March 2016

U-boot fails to load env from I2C eeprom if SPI is enabled

U-boot failed to load environment from an I2C eeprom with the following errors:

U-Boot SPL 2015.10-00002-gfedeb03-dirty (Mar 08 2016 - 13:05:30)
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
reading u-boot.img


U-Boot 2015.10-00002-gfedeb03-dirty (Mar 08 2016 - 13:05:30 +0000)

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
i2c_read: error waiting for addr ACK (status=0x116)
*** Error - default environment is too large

Net:   <ethaddr> not set. Validating first E-fuse MAC
Phy 0 not found
cpsw
Error: cpsw address not set.
, usb_ether
Error: usb_ether address not set.

env_buf [32 bytes] too small for value of "bootcmd"
Hit any key to stop autoboot:  0 

On investigation, adding a debug output I found that the wrong I2C address was being read:
I2C read: addr:0 len:4 alen:1 chip:0x00

My configuration defines the env on an eeprom at 0x50:
/* EEPROM (24C16) */
#define CONFIG_CMD_EEPROM
#define CONFIG_ENV_IS_IN_EEPROM
#define CONFIG_I2C_ENV_EEPROM_BUS 1
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 /* Main EEPROM */
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
#define CONFIG_SYS_I2C_MULTI_EEPROMS
#define CONFIG_SYS_EEPROM_PAGE_WRITE_ENABLE
#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 3  /* 8 Byte write page */
#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 10
#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x07

Looking at the section of code at include/common.h:483:
#if defined(CONFIG_SPI) || !defined(CONFIG_SYS_I2C_EEPROM_ADDR)
# define CONFIG_SYS_DEF_EEPROM_ADDR 0
#else
#if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
# define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR
#endif
#endif /* CONFIG_SPI || !defined(CONFIG_SYS_I2C_EEPROM_ADDR) */

The logic is a bit confusing but appears to set CONFIG_SYS_DEF_EEPROM_ADDR to 0 if CONFIG_SPI is defined but I don't have CONFIG_SPI defined!

On closer inspection, an included default config for the SoC I was using had defined this so simply adding:
#undef CONFIG_SPI

Resolved the issue :-)