Kernel changes for custom hardware

From Low cost, low power, android ARM system board by - pico WiKi
Revision as of 19:28, 9 November 2011 by Npavel (Talk | contribs)
Jump to: navigation, search



Using the buzzer

You have to assign values between 0( which is no sound) to 255 to:


Using another LCD

You will need to recompile the kernel and setup the monitor and resolution from our board definition files.
To do this, follow this steps:

Adding a GPIO as a key in kernel

      {       /* J14 USR2 pin 1 gnd + pin 6*/
              .code           = KEY_UP,
              .gpio           = AT91_PIN_PC20,
              .active_low     = 1,
              .desc           = "Up Arrow",

The gpio-keys driver will automatically send KEY_UP event when USR2 pin is put to ground

Adding a GPIO as a led in kernel

       {       /* "usr3" led */                                                                                                                                                                                                               
               .name                   = "usr3",                                                                                                                                                                                              
               .gpio                   = AT91_PIN_PC21,                                                                                                                                                                                      
               .active_low             = 1,                                                                                                                                                                                                 
               .default_trigger        = "none",                                                                                                                                                                                            

The led can be controlled by writing 0 or 1 to /sys/class/leds/usr3

Working with GPIOs

For GPIOs that aren't bound in kernel to a device/key/led, you can control them from sysfs interface from /sys/class/gpio/
There you have multiple gpiochip<nnn> each corresponding to the A,B,C,D,E peripheals.
For example PC is gpiochip96

To export PC19 (which you will find it as USR1 on J14 pin 5) do:

echo "115" > export

which means 96+19.

a directory will appear in /sys/class/gpio/gpio115/ with 2 files (direction and value)

echo out > direction
echo 0 > value

To set output of GPIO to 0

Example setting a GPIO as input

 cd /sys/class/gpio/
 echo "115" > /sys/class/gpio/export
 cd /sys/class/gpio/gpio115/
 echo in > direction
 cat value

Working with Analog-to-Digital Converter (ADC)

The ADC in picoSAM9G45 board provides 7 channels. 3 of these are used for the resistive touchscreen, the rest of 4 channels (available through J16) have a 10-bit resolution and can be used to perform analog to digital conversions.

The kernel will provide the following files to read values from the each ADC channel (note that this functionality is not yet in the releases images see atmel_adc)


How to read and interpret the values:

  cat /sys/devices/platform/atmel_adc/ani0 

should output an integer value, that will need to be scaled as: (ani value) * max voltage range / bit resolution.

For ani0 and ani1 (voltage in 0V-50V range): (ani0 value) * 50/1023
For ani2 and ani3 (voltage in 0V-5V range): (ani2 value) * 5 /1023

Note: The value for ani0 will always be the voltage that powers the picoSAM9G45 board.

The reads are rate limited to work concurrently with the resistive touchscreen. If a resistive touchscreen is not used the rate limit can be disabled by editing the driver source code.

J16 connector from pico-SAM9G45 board.

Power cycle/Reset miniPCI-E cards or USB devices

Some miniPCI-E cards might not work after power-on. To fix this issue a software "reset" is needed:

 cd /sys/bus/usb/devices
 ls -l

Notice the folders with 1-2, 2-2 etc, to identify the product do:

 cat 1-2/product 

and repeat for all folders till you identify the card

To reset issue:

 echo 0 > 1-2/authorized
 echo 1 > 1-2/authorized

Working with SPI interface

SPI interface can be accessed from userspace through spidev kernel driver.
As of 12 Oct 2011 the spidev is included in binary releases.

By default the SPI devices from J7 Connector and J9 Connector (SPI0.0 and SPI1.0) are bound to this spidev driver.
If you need to bound a spi device to another kernel driver edit arch/arm/mach-at91/board-picosam9g45.c around line 135 (SPI devices) and change .modalias to your driver name.

For testing spidev_test can be used.
A sample output is:

root@picosam9:~# /spidev_test -s 14814814 -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 14814814 Hz (14814 KHz)
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 

/dev/spidev0.0 means the spi device on bus 0 chipselect 0 (SPI0 SPI0_CS0 in schematics for J7 connector)

Working with I²C interface

I²C interface can be accessed from userspace through i2c-dev kernel driver.

For testing i2c-dev communication qtouch-control can be used as an example.
More advanced tools can be found here

picoSAM9G45 board schematics
- mechanical drawings
- detailed schematics
- top side view
- bottom side view
- connectors detailed pinout

Personal tools