UTN-FRA Laboratorio de Software Libre Erneto !igliotti UTN FRA LSL http://www.lslfra.com.ar 1 Android on Beaglebone Black (Rev 2) "ontent T#torial $% & Creating an S car! An!roi! Te"as #nstr$ments #mage for %eagle&one %lac'. T#torial $2 & Accessing the An!roi! Console &( A%. T#torial $' & Controlling )*#+s o,er An!roi! +perating S(stem. T#torial $( & Creating a &oot script for har!ware initiali-ation. T#torial $) & Compiling Te"as #nstr$ments An!roi! 'ernel from so$rce. T#torial $* & #.C mo!$les. /"ample with L012 temperat$re sensor. T#torial $+ & UART1 an! UART. mo!$les. T#torial $, & S*# mo!$le. T#torial $- & Compiling a c$stom An!roi! !ri,er as a char !e,ice. T#torial %$ & Accessing to har!ware from c$stom An!roi! !ri,er. T#torial % % & Compiling 'ernel 3.4 with !e,ice tree s$pport for An!roi!. T#torial %2 & Using *50 mo!$les. T#torial %' & Using AC mo!$le. E.a/0le& 1tt0&22o#rceforge3net20ro4ect2androidonbeaglebonebt#torial Rev3 "orrection 6 +riginal !oc$ment 1 S*# T$torial: cloc' pin m$st &e inp$t . T(pographical errors7 8ernel 3.47 *507AC Licene T1i work i licened #nder t1e "reative "o//on Attrib#tion-S1areAlike (3$ 5nternational Licene3 To view a co06 of t1i licene7 viit 1tt0&22creativeco//on3org2licene2b6-a2(3$2deed3en8US3 9Android on Beaglebone Black: b6 Erneto !igliotti3 "ontact & ernetogigliotti;g/ail3co/ UTN FRA LSL http://www.lslfra.com.ar . Android on Beaglebone Black (Rev 2) T#torial $%& Creating S car! An!roi! Te"as #nstr$ments #mage for %eagle&one %lac'. Re9$irements: This t$torial is &ase! in a *C with U&$nt$ 13 :;&it +perating S(stem. 0icro S car! class 1< preferentiall(. First of all7 we ha,e to !ownloa! the T# An!roi! #mage from T#=s we& page: http://!ownloa!s.ti.com/sitara>an!roi!/es!/T#>An!roi!>e,8it/T#>An!roi!>?%>;>.>.>e,8it>;>1> 1/in!e">FS.html #n the @*re6%$ilt #magesA section7 we !ownloa! @%eagle&one %lac'A 5hen the file is finishe! to !ownloa!7 we ha,e to $ncompress it. #nsi!e the fol!er we will fin! the script @m'mmc6an!roi!.shA with this script we will &e a&le to create an An!roi! #mage for o$r %eagle&one %lac'. Steps 1B *l$g (o$r micro S car! in the SCar! rea!er. #f (o$ ha,e a note&oo' with an integrate! rea!er7 the car! will appear in /!e,/mmc&l'. #f (o$ ha,e an US% rea!er7 the car! will appear in /!e,/s!c or /!e,/s!C it will !epen! how man( partitions (o$ ha,e in (o$r comp$ter. #n this t$torial we will $se mmc&l' !e,ice .B As root7 grant e"ec$tion permissions for the script: chmod +x mkmmc-android.sh 3B /"ec$te the script an! image will &e copie! into the S car!: ./mkmmc-android.sh /dev/mmcblk <ARN5N!& #f (o$ p$t a wrong path where it sa(s @mmc&l'A(o$ can !estro( (o$r partition. +nce the script finishe!7 (o$ can p$t the S car! into the %eagle&one %lac' an! power it7 An!roi! will &oot. UTN FRA LSL http://www.lslfra.com.ar 3 Android on Beaglebone Black (Rev 2) T#torial $2& Accessing the An!roi! Console &( A% Re9$irements: An!roi! S8 installe! in (o$r comp$ter 5hen we pl$g the %eagle=s mini US% connector to o$r comp$ter7 we can connect to An!roi! &( A%. The first step is to config$re U&$nt$ for recogni-e the %eagle&one %lac' as a ,ali! US% !e,ice. Steps 1B As root7 create the file @/etc/$!e,/r$les.!/216an!roi!.r$les A nano /etc/udev/rules.d/51-android.rules .B *$t the following te"t insi!e the file: SU%SDST/0EEF$s&F7 SDSFSGi!Hen!orIEEF14!1F7 0+/EF<:::F SU%SDST/0EEF$s&F7 SDSFSGi!Hen!orIEEF<;21F7 0+/EF<:::F 3B As root7 change the file=s permissions: chmod a+r /etc/udev/rules.d/51-android.rules ;B As root7 go to the a!& !irector( insi!e An!roi!6S8 an! 'ill a!& an! restart it listing the !e,ices !etecte! J%eagle&one %lac' m$st &e pl$gge!B: ./adb kill-server ./adb devices The o$tp$t will &e something li'e: List of devices attached 0123456789ABCDEF device 2B Then we are a&le to enter in the An!roi! console t(ping: ./adb shell :B if we want to cop( a file from o$r comp$ter to the %eagle&one %lac' we can $se the @p$shA a!&=s comman!: ./adb push ~/beagleboneblack/foo.txt /etc/ 5e can too open /clipse an! $se the &oar! as another em$lator or phone7 !ownloa!ing applications in it. UTN FRA LSL http://www.lslfra.com.ar ; Android on Beaglebone Black (Rev 2) T#torial $'& Controlling )*#+s o,er An!roi! +perating S(stem #n this t$torial we are going to control $ser=s le! in the &oar!. *rocessor pins for Users Le!s: USR< )*#+1>.1 USR1 )*#+1>.. USR. )*#+1>.3 USR3 )*#+1>.; )*#+ control is not a,aila&le for !efa$lt7 we nee! to create a !irector( for each )*#+ we want to control7 an! there will &e files in there that will allow $s to control the pins. Steps 1B /nter to An!roi! Console &( a!& ./adb shell .B )o to !irector( s(s/class/gpio: cd /sys/class/gpio 3B There7 we will fin! the files an! !irectories: export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport /ach gpiochipCC correspon!s to a 3. &it )*#+ *ort. For pin n$m&er calc$lation7 we nee! to calc$late the follow: pin n$m&er E Jport n$m&er K 3.B L gpio n$m&er for e"ample7 for $ser le! < J )*#+1>.1 B pin n$m&er E J1 K 3.B L .1 E 23 3B Now we 'now the pin n$m&er we want to control7 we nee! to generate the !irector( for this pin7 that is ma!e writing the pin n$m&er in the @e"portA file: echo 53 > /sys/class/gpio/export ;B one that7 a new !irector( will appear: export gpio53 <- This directory is new gpiochip0 gpiochip32 gpiochip64 UTN FRA LSL http://www.lslfra.com.ar 2 Android on Beaglebone Black (Rev 2) gpiochip96 unexport 2B )o to this !irector(: cd gpio53 :B There7 we will fin! some files: active_low direction edge power subsystem uevent value 1B 5e will $se @!irectionA file to config$re the pin as inp$t or o$tp$t. 5e write @highA in it for o$tp$t: echo high > direction 4B Now we can control the pin state $sing @,al$eA file7 writing a @1A7 $ser le! < will t$rn on7 an! writing a @<A7 $ser le! < will t$rn off. echo 0 > value echo 1 > value Consi!erations: 5hen we re&oot the &oar! the @gpio23A !irector( will not &e a,aila&le an! we will nee! to create it again. This pro&lem is sa,e! $sing a &oot script where this initiali-ation is ma!e. UTN FRA LSL http://www.lslfra.com.ar : Android on Beaglebone Black (Rev 2) T#torial $(& Creating a &oot script for har!ware initiali-ation. #f we want that )*#+s Jor other har!ware mo!$lesB are initiali-e! when An!roi! &oots7 we nee! to create a script with the gpios config$ration steps. 5e will name this file @cri0tg0io31A The content of this file will &e: MConfig$re L/ US/R < 6 )*#+1>.1 echo 23 N /s(s/class/gpio/e"port c! /s(s/class/gpio/gpio23 M irection : o$t echo high N !irection echo < N ,al$e chmo! 111 ,al$e chmo! 111 !irection Now we nee! to e"ec$te this script at the &eginning of the An!roi! &ooting. For that7 we nee! to e!it the @init3rcA file that is place! in An!roi!=s file s(stem root. Since we can not e!it the file insi!e An!roi! +perating S(stem Jwe !o not ha,e a te"t e!itor in An!roi! consoleB we are going to e!it the file pl$gging the S car! in o$r comp$ter an! e!iting the file from there. 5hen we !o that7 fo$r partitions will appear: &oot rootfs $sr!ata !ata #n rootfs partition7 we will fin! the init.rc file. Now we can e!it it with ,im or nano. Steps 1B +pen init.rc file with nano .B Search for the lines: ser,ice !e&$gger! /s(stem/&in/!e&$gger! class main %ellow these lines7 we are going to write o$r script initiali-ation: ser,ice scriptgpios /s(stem/&in/sh /s(stem/etc/scriptgpios.sh class main oneshot 3B Cop( @scriptgpios.shA from (o$r comp$ter to @/s(stem/etcA in the rootfs partition of the S car!. This file m$st ha,e e"ec$tion permissions. Then we $nmo$nt all partitions an! p$t S car! again in the &oar!7 when An!roi! &oots7 this time )*#+s will &e config$re!. UTN FRA LSL http://www.lslfra.com.ar 1 Android on Beaglebone Black (Rev 2) T#torial $)& Compiling Te"as #nstr$ments An!roi! 'ernel from so$rce. #f we want to compile An!roi! 'ernel J $sef$l if we want to create o$r c$stom !ri,ers B we nee! to !ownloa! T#6e,8it from Te"as we& page: http://!ownloa!s.ti.com/sitara>an!roi!/es!/T#>An!roi!>e,8it/T#>An!roi!>?%>;>.>.>e,8it>;>1> 1/in!e">FS.html #n the @T# An!roi! So$rcesA section7 we !ownloa! @T# An!roi! ?% ;.... e,8itH;.1.1 A0332" So$rcesA Steps 1B The file !ownloa!e! is a @.&inA we nee! to change e"ec$tion permissions an! e"ec$te it: chmod +x TI_Android_JB_4.2.2_DevKit_4.1.1.bin ./TI_Android_JB_4.2.2_DevKit_4.1.1.bin 5e s$ppose this file is in @O/&eagle&one&lac'A !irector(7 if (o$ are $sing another path7 pa( attention an! change it in all parts where it appears. .B +nce the &inar( file !ecompresse!7 the !irector( @T#>An!roi!>?%>;....>e,8it>;.1.1A will appear. Now we can compile the 8ernel: cd ~/beagleboneblack/TI_Android_JB_4.2.2_DevKit_4.1.1/kernel PATH=$HOME/beagleboneblack/TI_Android_JB_4.2.2_DevKit_4.1.1/prebuilts/gcc/linux- x86/arm/arm-eabi-4.6/bin:$PATH make ARCH=arm CROSS_COMPILE=arm-eabi- distclean make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig make ARCH=arm CROSS_COMPILE=arm-eabi- uImage This process can ta'e some of min$tes !epen!ing of (o$r comp$ter. 3B 8ernel image will &e create! in T#>An!roi!>?%>;....>e,8it>;.1.1/'ernel/arch/arm/&oot. File=s name is @$#mageA. *$t the SCar! in (o$r car! rea!er an! cop( this file into @&ootA partition. UTN FRA LSL http://www.lslfra.com.ar 4 Android on Beaglebone Black (Rev 2) T#torial $*& #.C mo!$les. /"ample with L012 temperat$re sensor. Re9$irements: A &oar! with an L012 #.C temperat$re sensor. An!roi! N8 installe! in (o$r comp$ter. 5e are going to config$re #.C port an! we are going to $se it for rea!ing an L012 temperat$re sensor. #f we na,igate An!roi! !irector(7 in /!e, we are going to fin! @i.c63A !e,ice. This !e,ice correspon!s with the pins 1P an! .< from *P connector on the &oar!. =- 0in > 52" f#nction 1P SCL .< SA Steps 1B 5e will connect L012 chip to this port. *ower s$ppl( can &e ta'en from the &oar! from pins 1 an! ;. .B 5e are going to write a C program for $se #.C !e,ice as a character !e,ice for rea!ing L012. For that7 we nee! to create a proQect !irector(: @lm12testA. Then we nee! to create the @QniA !irector( insi!e. #nsi!e Qni fol!er7 we are going to create a @0ain.cA file. mkdir lm75test cd lm75test mkdir jni cd jni nano Main.c 3B 5rite the C co!e $sing open7 rea!7 write7 an! ioctl f$nctions: Mincl$!e Rst!io.hN Mincl$!e Rst!li&.hN Mincl$!e Ri.c6!e,.hN Mincl$!e Rs(s/ioctl.hN Mincl$!e Rs(s/t(pes.hN Mincl$!e Rs(s/stat.hN Mincl$!e Rfcntl.hN int fileS char Kfilename E F/!e,/i.c63FS if JJfile E openJfilename7 +>R5RBB R <B e"itJ1BS //1 < < 1 A. A1 A< R/5 int a!!r E <";4S // e,ice a!!ress is <";4 if JioctlJfile7 #.C>SLAH/7 a!!rB R <B e"itJ1BS $nsigne! char &$fT1<U E G<IS ifJwriteJfile7 &$f71B VE 1B e"itJ1BS int r E rea!Jfile7&$f7.BS $nsigne! char tempW E &$fT<US $nsigne! char tempL E &$fT1US UTN FRA LSL http://www.lslfra.com.ar P Android on Beaglebone Black (Rev 2) $nsigne! short tempS tempEtempWS tempEtempRR1S tempEtempX<"FFF/S tempLEtempLNN1S tempLEtempLX<"<<<1S tempEtempYtempLS float t E JJfloatBtempB/.S printfJFTemperat$re:Zf[nF7tBS ;B To compile this co!e we will $se An!roi!6N87 for that reason7 we nee! to create two e"tra files: @Application.m'A an! @An!roi!.m'A Application.m': A**>+*T#0 :E release A**>*LATF+R0 :E an!roi!612 An!roi!.m': L+CAL>*ATW :E \Jcall m(6!irB incl$!e \JCL/AR>HARSB L+CAL>0+UL/ :E lm12test L+CAL>SRC>F#L/S :E 0ain.c incl$!e \J%U#L>/C/CUTA%L/B
2B 5e can compile o$r co!e now7 insi!e Qni !irector( we e"ec$te N8 compiler Jthe path can change if (o$ are $sing a newer ,ersionB ~/adt-bundle-linux-x86_64-20130219/android-ndk-r8d/ndk-build :B #f compilation was +87 it will generate the e"ec$ta&le file in: lm12test/li&/armea&i/lm12test 1B Cop( the e"ec$ta&le into %eagle&one=s An!roi! etc !irector(: ./adb push lm75test/lib/armeabi/lm75test /etc/ 4B /nter to An!roi! console7 change e"ec$tion permissions for o$r program an! e"ec$te it. ./adb shell cd etc chmod 777 lm75test ./lm75test The program will print the act$al temperat$re rea! from L012. Consi!erations #f we want7 an( An!roi! application can access this !e,ice7 we nee! to a!! to the &oot script we ma!e &efore7 the permissions for the !e,ice: chmod 777 /dev/i2c-3 UTN FRA LSL http://www.lslfra.com.ar 1< Android on Beaglebone Black (Rev 2) T#torial $+& UART1 an! UART. mo!$les. Re9$irements: &$s(&o" m$st &e installe! UART 1 an! . pino$t: "onnector =- *#N .; UART1>TC *#N .: UART1>RC *#N .1 UART.>TC *#N .. UART.>RC UART1 is manage! &( tt(+1 !e,ice J/!e,/tt(+1 B UART. is manage! &( tt(+1 !e,ice J/!e,/tt(+.B %( !efa$lt7 pins are in 0+/1 J)*#+B if we want to $se this pins as UARTs we nee! to change pins m$" config$ration. Steps 1B 5e can see UART1 pins m$" config$ration with the following comman!: cat /sys/kernel/debug/omap_mux/uart1_rxd .B %( !efa$lt7 pin m$" is )*#+7 we nee! to change it to UART1 RC echo 20 > /sys/kernel/debug/omap_mux/uart1_rxd Now when we chec' config$ration7 it will &e: name: uart1_rxd.uart1_rxd (0x44e10980/0x980 = 0x0020), b NA, t NA mode: OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN signals: uart1_rxd | mmc1_sdwp | NA | i2c1_sda | NA | pr1_uart0_rxd_mux1 | NA | gpio0_14 3B Same wa( we change t" pin config$ration. echo 0 > /sys/kernel/debug/omap_mux/uart1_txd ;B Now we !o the same for UART.7 in this case pins are calle! spi<>!< an! spi<>scl' in An!roi! file s(stem. echo 1 > /sys/kernel/debug/omap_mux/spi0_d0 echo 21 > /sys/kernel/debug/omap_mux/spi0_sclk 2B To test UARTs we are going to $se @microcomA an application incl$!e! in &$s(&o" similar to @minicomA. /data/busybox/busybox microcom -s 9600 ttyO1 /data/busybox/busybox microcom -s 9600 ttyO2 N?TE& See steps 1; an! 12 from T$torial <P for &$s(&o" installation. UTN FRA LSL http://www.lslfra.com.ar 11 Android on Beaglebone Black (Rev 2) T#torial $,& S*# mo!$le. Re9$irements: T#6e,8it m$st &e installe!. An!roi! 8ernel m$st &e compile!. S*#< pino$t: "onnector =- *#N 11 S*#<>CS< *#N 14 S*#<>1 *#N .1 S*#<>< *#N .. S*#<>SCL8 S*# is not ena&le! &( !efa$lt7 we nee! to e!it @&oar!6am332"e,m.cA file7 enter in 'ernel =s men$config options an! ena&le S*#/H an! re6compile An!roi! 'ernel with this feat$res7 other wa( S*# !e,ice will not appear in /!e, !irector(.
%( !efa$lt7 pins are in 0+/1 J)*#+B if we want to $se these pins as S*# pins7 we nee! to change pins m$" config$ration. Steps 1B 5e are going to ena&le S*#< &eca$se S*#1 is $se! &( W0# mo!$le an! it cannot &e $se!. /!it @&oar!6am332"e,m.cA file in 'ernel=s !irector( @arch/arm/mach6omap./A nano arch/arm/mach-omap2/board-am335xevm.c .B Change @am332">spi<>sla,e>infoA str$ct for the follow one: static str$ct spi>&oar!>info am332">spi<>sla,e>infoTU E G G .mo!alias E Fspi!e,F7 .ma">spee!>h- E ;4<<<<<<7 //;4 0&ps .&$s>n$m E 17 .chip>select E <7 .mo!e E S*#>0+/>17 I7 IS 3B Change @spi<>initA f$nction for the follow one: static ,oi! spi<>initJint e,m>i!7 int profileB G set$p>pin>m$"Jspi<>pin>m$"BS spi>register>&oar!>infoJam332">spi<>sla,e>info7 ARRAD>S#]/Jam332">spi<>sla,e>infoBBS ret$rnS I ;B A!! in the @&eagle&one>&lac'>!e,>cfgTUA arra(7 this line : Gspi<>init7 /H>+N>%AS/%+AR7 *R+F#L/>N+N/I7 UTN FRA LSL http://www.lslfra.com.ar 1. Android on Beaglebone Black (Rev 2) 2B %efore compiling 'ernel7 enter in men$config options an! ena&le S*# settings: cd ~/beagleboneblack/TI_Android_JB_4.2.2_DevKit_4.1.1/kernel PATH=$HOME/beagleboneblack/TI_Android_JB_4.2.2_DevKit_4.1.1/prebuilts/gcc/linux- x86/arm/arm-eabi-4.6/bin:$PATH make ARCH=arm CROSS_COMPILE=arm-eabi- distclean make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig make ARCH=arm CROSS_COMPILE=arm-eabi- menuconfig 0a'e s$re @0cS*#A an! @User mo!e S*#A are ena&le!. e,ice ri,ers 6N S*# S$pport 6N TKU 0cS*# !ri,er for +0A* TKU User mo!e S*# !e,ice !ri,er s$pport :B Compile 'ernel make ARCH=arm CROSS_COMPILE=arm-eabi- uImage 1B Cop( 'ernel=s image into S car! an! &oot %eagle&one %lac'. Now !e,ice @spi!e,1.<A sho$l! appear in /!e, !irector(. root@android:/dev # ls spi* -la crw------- root root 153, 0 2000-01-01 00:00 spidev1.0 4B <ARN5N!: #n t$torial <17 we change pin m$" for UART.7 this pins are the same for S*#< cl' an! !<. 0a'e s$re pins spi<>scl' an! spi<>!< are in 0+/< chec'ing m$" files: cat /sys/kernel/debug/omap_mux/spi0_sclk name: spi0_sclk.spi0_sclk (0x44e10950/0x950 = 0x0020), b NA, t NA mode: OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN signals: spi0_sclk | uart2_rxd | i2c2_sda | NA | NA | NA | NA | gpio0_2
cat /sys/kernel/debug/omap_mux/spi0_d0 name: spi0_d0.spi0_d0 (0x44e10954/0x954 = 0x0020), b NA, t NA mode: OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN signals: spi0_d0 | uart2_txd | i2c2_scl | NA | NA | NA | NA | gpio0_3 #f pins are not as the o$tp$t a&o,e7 we nee! to change them writing a @.<A in these files7 also we nee! to !isa&le p$ll6$p in spi<>!<. N+T/: scl' m$st &e an inp$t &eca$se a 'ernel=s &$g. echo 20 >> /sys/kernel/debug/omap_mux/spi0_sclk echo 20 >> /sys/kernel/debug/omap_mux/spi0_d0 PB 5e can chec' S*# mo!$le writing a simple C program an! connecting spi<>!< an! spi<>!1 ph(sicall( with a wire. The program will transmit an! recei,e a few &(tes. Create a n!' proQect: mkdir spiTestProject cd spiTestProject mkdir jni cd jni nano spitest.c UTN FRA LSL http://www.lslfra.com.ar 13 Android on Beaglebone Black (Rev 2) 1<B 5rite hea!er files an! glo&al ,aria&les for spi config$ration. Mincl$!e Rst!io.hN Mincl$!e Rst!li&.hN Mincl$!e Rfcntl.hN Mincl$!e Rs(s/ioctl.hN Mincl$!e Rspi!e,.hN static const char K!e,ice E F/!e,/spi!e,1.<FS static $int4>t mo!e E S*#>0+/>1S static $int4>t &its E 4S static $int3.>t spee! E 1<<<<<S // 1<<8h- Then we are going to !efine an error f$nction: static ,oi! pa&ortJconst char KsB G perrorJsBS a&ortJBS I Now we write a transfer f$nction for spi test7 this f$nction will recei,e spi!e,=s file !escriptor: static ,oi! transferJint f!B G int retS $int4>t t"TU E G<"227<"C37<"3C7<"<17<"4<7<"FF7<"<<IS $int4>t r"Tsi-eofJt"BU E G<IS str$ct spi>ioc>transfer tr E G .t">&$f E J$nsigne! longBt"7 .r">&$f E J$nsigne! longBr"7 .len E si-eofJt"B7 .!ela(>$secs E 2<7 .spee!>h- E spee!7 .&its>per>wor! E &its7 .cs>changeE17 IS ret E ioctlJf!7 S*#>#+C>0/SSA)/J1B7 XtrBS if Jret R 1B pa&ortJFcan=t sen! spi messageFBS printfJFr":FBS for Jret E <S ret R si-eofJt"BS retLLB printfJFZ..C F7 r"TretUBS printfJF[r[nFBS I
At the en!7 we write the main f$nction7 where we open spi!e, !e,ice an! we config$re it $sing ioctl f$nction &efore calling @transferA f$nction: int mainJint argc7 char Karg,TUB G int ret E <S int f!7 co$nterS f! E openJ!e,ice7 +>R5RBS if Jf! R <B pa&ortJFcan=t open !e,iceFBS // set mo!e ret E ioctlJf!7 S*#>#+C>5R>0+/7 Xmo!eBS if Jret EE 61B pa&ortJFcan=t set spi mo!eFBS ret E ioctlJf!7 S*#>#+C>R>0+/7 Xmo!eBS if Jret EE 61B pa&ortJFcan=t get spi mo!eFBS UTN FRA LSL http://www.lslfra.com.ar 1; Android on Beaglebone Black (Rev 2) // set &its per wor! ret E ioctlJf!7 S*#>#+C>5R>%#TS>*/R>5+R7 X&itsBS if Jret EE 61B pa&ortJFcan=t set &its per wor!FBS ret E ioctlJf!7 S*#>#+C>R>%#TS>*/R>5+R7 X&itsBS if Jret EE 61B pa&ortJFcan=t get &its per wor!FBS
// set ma" spee! h- ret E ioctlJf!7 S*#>#+C>5R>0AC>S*//>W]7 Xspee!BS if Jret EE 61B pa&ortJFcan=t set ma" spee! h-FBS ret E ioctlJf!7 S*#>#+C>R>0AC>S*//>W]7 Xspee!BS if Jret EE 61B pa&ortJFcan=t get ma" spee! h-FBS // Start Test printfJFspi mo!e: Z![nF7 mo!eBS printfJF&its per wor!: Z![nF7 &itsBS printfJFma" spee!: Z! W- JZ! 8W-B[nF7 spee!7 spee!/1<<<BS transferJf!BS
closeJf!BS ret$rn retS I 11B 5e also nee! to create An!roi!.m' an! Application.m': An!roi!.m' L+CAL>*ATW :E \Jcall m(6!irB incl$!e \JCL/AR>HARSB L+CAL>LL#%S :E 6llog L+CAL>0+UL/ :E testSpi L+CAL>SRC>F#L/S :E spitest.c incl$!e \J%U#L>/C/CUTA%L/B
Application.m' A**>+*T#0 :E release A**>*LATF+R0 :E an!roi!612 1.B Now we can compile this program $sing an!roi!6n!'7 in Qni !irector(7 e"ec$te: ~/adt-bundle-linux-x86_64-20130219/android-ndk-r8d/ndk-build :B #f compilation was +87 it will generate the e"ec$ta&le file in: spiTest*roQect/li&s/armea&i/ 1B Cop( the e"ec$ta&le into %eagle&one=s An!roi! etc !irector(: ./adb push spiTestProject/libs/armeabi/testSpi /etc/ 4B /nter to An!roi! console7 change e"ec$tion permissions for o$r program an! e"ec$te it. ./adb shell cd etc chmod 777 testSpi ./testSpi UTN FRA LSL http://www.lslfra.com.ar 12 Android on Beaglebone Black (Rev 2) T#torial $-& Compiling a c$stom An!roi! !ri,er as a char !e,ice. Re9$irements: T#6e,8it m$st &e installe! An!roi! 8ernel m$st &e compile! Steps 1B Create a fol!er for the 8ernel 0o!$le proQect mkdir moduleProject cd moduleProject .B Create a C file name! @c$stom0o!$le.cA: nano customModule.c 3B 5e nee! to write the 'ernel mo!$le7 first of all7 we incl$!e some hea!ers files an! !efines: Mincl$!e Rlin$"/mo!$le.hN Mincl$!e Rlin$"/'ernel.hN Mincl$!e Rlin$"/fs.hN Mincl$!e Rlin$"/'!e,>t.hN Mincl$!e Rasm/$access.hN 0+UL/>L#C/NS/JF)*LFBS 0+UL/>AUTW+RJF/rnesto )igliotti Rernestogigliotti^gmail.comNFBS 0+UL/>/SCR#*T#+NJFAn!roi! C$stom ri,erFBS ;B Then7 we !efine some constants an! the file operations str$ct$re7 this str$ct$re will contain the f$nctions that will &e calle! &( the program $ser when it calls rea!7write7open7ioctl an! close f$nctions. M!efine 0+UL/>NA0/ Fc$stom0o!$leF $nsigne! int mo!$le>maQorS str$ct file>operations fopsS 2B Now we can write the @init>mo!$leA f$nction7 this f$nction will &e calle! when the mo!$le is installe!. int init>mo!$leJ,oi!B G int res$ltS // Asign file operation f$nctions fops.open E open>mo!$leS fops.release E release>mo!$leS //fops.rea! E rea!>mo!$leS //fops.write E write>mo!$leS //fops.$nloc'e!>ioctl E ioctl>mo!$leS //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // inamic reser,ation for maQor n$m&er res$ltEregister>chr!e,J<7 0+UL/>NA0/7 XfopsBS if Jres$lt R <B G print'J8/RN>5ARN#N) Fan!roi!C$stom0o!$leN Jinit>mo!$leB error o&taining maQor n$m&er[nFBS ret$rn res$ltS I mo!$le>maQor E res$ltS print'J 8/RN>#NF+ Fan!roi!C$stom0o!$leN Jint>mo!$leB loa!e! +8[nFBS ret$rn <S I UTN FRA LSL http://www.lslfra.com.ar 1: Android on Beaglebone Black (Rev 2) :B 5rite @clean$p>mo!$leA f$nction. This f$nction will &e calle! when the mo!$le is $nloa!e!: ,oi! clean$p>mo!$leJ,oi!B G $nregister>chr!e,Jmo!$le>maQor7 0+UL/>NA0/BS print'J 8/RN>#NF+ Fan!roi!C$stom0o!$leN Jclean$p>mo!$leB $nloa!e! +8[nFBS I 1B 5rite the @open>mo!$leA f$nction. This f$nction will &e calle! when $ser=s program calls @openA f$nction $sing o$r !e,ice. int open>mo!$leJstr$ct ino!e Kpino!e7 str$ct file KpfileB G int minorE 0#N+RJpino!e6Ni>r!e,BS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JopenB minorEZ! +8[nF7minorBS ret$rn <S I 4B 5rite @release>mo!$leA f$nction. This f$nction will &e calle! when $ser=s program calls @closeA f$nction $sing o$r !e,ice. int release>mo!$leJstr$ct ino!e Kpino!e7 str$ct file KpfileB G int minorE 0#N+RJpino!e6Ni>r!e,BS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JreleaseB minorEZ! +8[nF7minorBS ret$rn <S I PB %efore we write the rea!7write an! ioctl f$nctions7 we are going to compile this 'ernel mo!$le Q$st with the f$nctions mentione! a&o,e. For that7 we nee! to create a 0a'efile. Create a file name! @0a'efileA with this content: 0a'efile: o&Q6m LEc$stom0o!$le.o 8/RN/L#R _E O/&eagle&one&lac'/T#>An!roi!>?%>;....>e,8it>;.1.1/'ernel *5 :E \Jshell pw!B CR+SS>C+0*#L/EO/&eagle&one&lac'/T#>An!roi!>?%>;....>e,8it>;.1.1/pre&$ilts/gcc/lin$"6"4:/arm/arm6ea&i6;.:/&in/ arm6ea&i6 ARCWEarm !efa$lt: \J0A8/B 6C \J8/RN/L#RB 0E\J*5B ARCWEarm CR+SS>C+0*#L/E\JCR+SS>C+0*#L/B mo!$les clean: \J0A8/B 6C \J8/RN/L#RB 0E\J*5B clean #n this 0a'efile we pass the 'ernel=s path insi!e T#6e,8it. 8ernel m$st &e compile!. Also we pass the compiler=s path. Change these paths if (o$ ha,e T#6e,8it in another place. 1<B 5rite f$nction protot(pes at the &eginning of the file: int open>mo!$leJstr$ct ino!e Kpino!e7 str$ct file KpfileBS int release>mo!$leJstr$ct ino!e Kpino!e7 str$ct file KpfileBS 11B Now we can compile the mo!$le e"ec$ting @ma'eA comman!: make File @c$stom0o!$le.'oA will &e generate!. UTN FRA LSL http://www.lslfra.com.ar 11 Android on Beaglebone Black (Rev 2) 1.B Now we can install o$r mo!$le into the An!roi! +perating S(stem. Cop( the mo!$le &( a!& an! install it: ./adb push /home/USER/beagleboneblack/moduleProject/customModule.ko /etc ./adb shell cd /etc insmod customModule.ko 13B The mo!$le will &e installe! an! we can see 'ernel=s log messages in 'msg file: cat /proc/kmsg +$tp$t will &e: <6>[ 700.884185] androidCustomModule> (int_module) loaded OK 5e can $nloa! the mo!$le with @rmmo!A comman! 1;B Now o$r mo!$le is wor'ing7 we nee! to create one or more !e,ices in /!e, !irector(. 5e nee! to $se @m'no!A comman! for that7 &$t this comman! is not part of T# An!roi! !istri&$tion. 5e nee! to install &$s(&o". This application will allow $s to $se a &ig set of stan!ar! Lin$"=s comman!s on An!roi!7 incl$!e! @m'no!A ownlo! &$s(&o" from: https://gforge.ti.com/gf/proQect/omapan!roi!/wi'i/_ pagenameE#nstallingL%$s(&o"Lcomman!LlineLtools 12B 5e nee! to cop( &$s(&o" e"ec$ta&le file into /!ata/&$s(&o" in An!roi! files(stem: ./adb shell mkdir /data cd /data mkdir busybox CTRL+D (quit from Android console) ./adb push /home/USER/beagleboneblack/busybox /data/busybox/ 1:B Now we nee! to create a script for mo!$le=s installation J $sing insmo! an! m'no! comman!s B this script will install the mo!$le an! it will create the !e,ices in /!e, !irector(: install0o!$le.sh MV/s(stem/&in/sh mo!$leEc$stom0o!$le !e,iceE/!e,/an!roi!6c$stom6!e,6 permE::: rmmo! \Gmo!$leI insmo! \Gmo!$leI.'o maQorE`cat /proc/!e,ices Y grep \Gmo!$leI Y /!ata/&$s(&o"/&$s(&o" c$t 6!= = 6f1` rm 6f \G!e,iceIK /!ata/&$s(&o"/&$s(&o" m'no! \G!e,iceI< c \GmaQorI < /!ata/&$s(&o"/&$s(&o" m'no! \G!e,iceI1 c \GmaQorI 1 chmo! \GpermI \G!e,iceI_ #n this script we !elete the mo!$le7 then we install it an! we get the maQor n$m&er generate!. Then the script !eletes c$rrent !e,ices7 an! creates the new ones with the maQor n$m&er o&taine! &efore. UTN FRA LSL http://www.lslfra.com.ar 14 Android on Beaglebone Black (Rev 2) 11B Cop( c$stom0o!$le.'o an! install0o!$le.sh into /etc on An!roi! &( a!&: ./adb push /home/USER/beagleboneblack/moduleProject/customModule.ko /etc ./adb push /home/USER/beagleboneblack/moduleProject/installModule.sh /etc 14B /nter to An!roi! console an! e"ec$te the script: ./adb shell cd /etc chmod 777 installModule.sh ./installModule #f installation is +87 we will &e a&le to see two new !e,ices in /!e, /!e,/an!roi!6c$stom6!e,6< /!e,/an!roi!6c$stom6!e,61 1PB Now the mo!$le is wor'ing7 we are going to complete the mo!$le C program with write7rea! an! ioctl f$nctions. +pen again c$stom0o!$le.c an! a!! rea! f$nction: First the protot(pe at the &egining: static ssi-e>t rea!>mo!$leJstr$ct file Kfilp7char K&$ffer7si-e>t length7loff>t KoffsetBS Then the f$nction: static ssi-e>t rea!>mo!$leJstr$ct file Kfilp7 char K&$ffer7 /K The &$ffer to fill with !ata K/ si-e>t length7 /K The length of the &$ffer K/ loff>t KoffsetB /K +$r offset in the file K/ G int &(tes>rea! E <S int minorE 0#N+RJfilp6Nf>!entr(6N!>ino!e6Ni>r!e,BS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN Jrea!B minor: Zi [nF7minorBS char messageT:;UEFWello from mo!$le[<FS char K msg>*tr E messageS while JlengthN<BG /K p$t>$ser copies !ata from K the 'ernel !ata segment to the $ser !ata segment. K/ p$t>$serJKJmsg>*trB7 &$fferLLBS length66S &(tes>rea!LLS ifJKJmsg>*trBEE<B &rea'S msg>*trLLS I ret$rn &(tes>rea!S I
#n this mo!$le7 we are sim$lating a !e,ice which we can rea! the message @Wello from !e,iceA @p$t>$serA f$nction is $se! to cop( !ata from 'ernel space to $ser space. o not forget $ncomment fops assignment in init>mo!$le f$nction. UTN FRA LSL http://www.lslfra.com.ar 1P Android on Beaglebone Black (Rev 2) .<B 5rite the @writeA f$nction an! its protot(pe: *rotot(pe: static ssi-e>t write>mo!$leJstr$ct file Kpfile7 const char K&$f7 si-e>t si-e>&$f7 loff>t Kf>posBS
F$nction: static ssi-e>t write>mo!$leJstr$ct file Kpfile7 const char K&$f7 si-e>t si-e>&$f7 loff>t Kf>posB G $nsigne! long not>copie!S int menorE 0#N+RJpfile6Nf>!entr(6N!>ino!e6Ni>r!e,BS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JwriteB minor: Zi [nF7menorBS char msg#nT:;US not>copie!E>>cop(>from>$serJmsg#n7&$f7si-e>&$fBS // cop( from $ser space to 'ernel space if Jnot>copie!N<B G print'J8/RN>5ARN#N) Fan!roi!C$stom0o!$leN JwriteB error cop(ing !ata from $ser[nFBS ret$rnJ6/FAULTBS I print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JwriteB msg:Zs [nF7msg#nBS JKf>posBLEsi-e>&$fS ret$rnJsi-e>&$fBS I #n this case7 this f$nction prints &( 'ernel log the message that it recei,es for writing. .1B The last f$nction we are going to write is @ioctlA this f$nction will allow $s to config$re o$r !e,ice thro$gh comman!s. 5e nee! to create o$r hea!er file calle! @c$stom0o!$le.hA c$stom0o!$le.h: M!efine CUST+0>0+UL/>#+C>N0A)#C =c= M!efine CUST+0>0+UL/>#+C>C0>< >#+JCUST+0>0+UL/>#+C>N0A)#C7 1B M!efine CUST+0>0+UL/>#+C>C0>1 >#+JCUST+0>0+UL/>#+C>N0A)#C7 .B M!efine CUST+0>0+UL/>#+C>C0>. >#+JCUST+0>0+UL/>#+C>N0A)#C7 3B M!efine CUST+0>0+UL/>#+C>C0>3 >#+JCUST+0>0+UL/>#+C>N0A)#C7 ;B M!efine CUST+0>0+UL/>#+C>C0>; >#+5JCUST+0>0+UL/>#+C>N0A)#C7 27 1B #n o$r hea!er file we !efine a @magic n$m&erA for the !ri,er an! comman!s for !e,ice config$ration. User will call ioctl passing this comman!s to the !ri,er. #octl f$nction: long ioctl>mo!$leJstr$ct file Kpfile7 $nsigne! int cm!7 $nsigne! long argsB G int minorE 0#N+RJpfile6Nf>!entr(6N!>ino!e6Ni>r!e,BS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JioctlB minor: Zi [nF7minorBS if J>#+C>TD*/Jcm!B VE CUST+0>0+UL/>#+C>N0A)#CB ret$rn 6/#NHALS if J>#+C>NRJcm!B NE 2B // we ha,e onl( 2 comman!s ret$rn 6/#NHALS print'J8/RN>#NF+ Fan!roi!C$stom0o!$leN JioctlB C0: Z! [nF7 >#+C>NRJcm!BBS switchJcm!B G case CUST+0>0+UL/>#+C>C0><: // ... &rea'S // +ther comman!s //... !efa$lt: ret$rn 6/#NHALS I ret$rn <S I UTN FRA LSL http://www.lslfra.com.ar .< Android on Beaglebone Black (Rev 2) ..B Compile the mo!$le again an! cop( it into %eagle%one=s An!roi!. Now we are going to create a Test program for o$r !e,ice. Create a @!e,iceTest*roQectA !irector(7 a Qni fol!er insi!e7 cop( the mo!$le hea!er file insi!e Qni fol!er an! create test.c file. mkdir deviceTestProject cd deviceTestProject mkdir jni cd jni cp ~/beagleboneblack/moduleProject/customModule.h . nano test.c .3B 5rite a test program $sing open7 rea!7 write an! ioctl f$nctions on o$r !e,ice: test.c: Mincl$!e Rs(s/ioctl.hN Mincl$!e Rs(s/t(pes.hN Mincl$!e Rs(s/stat.hN Mincl$!e Rfcntl.hN Mincl$!e R$nist!.hN Mincl$!e Rst!io.hN Mincl$!e Fc$stom0o!$le.hF int mainJB G int file<7 res$ltS printfJFri,er Test[nFBS file<EopenJF/!e,/an!roi!6c$stom6!e,6<F7+>R5RBS if Jfile<EE61B ret$rnJ61BS char msgT:;US int r E rea!Jfile<7msg7:;BS printfJFRea! msg: Zs [nF7msgBS char &$fferT:;UEF0essage from $ser[<FS writeJfile<7&$ffer7:;BS res$ltEioctlJfile<7 CUST+0>0+UL/>#+C>C0><7NULLBS if Jres$ltEE<B printfJFioctl +8[nFBS else printfJFioctl /RR+R[nFBS closeJfile<BS ret$rn <S .;B Compile this test program $sing N8. o not forget create Application.m' an! An!roi!.m' files first: Application.m': A**>+*T#0 :E release A**>*LATF+R0 :E an!roi!612 An!roi!.m': L+CAL>*ATW :E \Jcall m(6!irB incl$!e \JCL/AR>HARSB L+CAL>0+UL/ :E !e,iceTest L+CAL>SRC>F#L/S :E test.c incl$!e \J%U#L>/C/CUTA%L/B )o to Qni fol!er an! compile the program $sing N8: ~/adt-bundle-linux-x86_64-20130219/android-ndk-r8d/ndk-build UTN FRA LSL http://www.lslfra.com.ar .1 Android on Beaglebone Black (Rev 2) .2B Cop( e"ec$ta&le file in /li&s/armea&i into %eagle%oar!=s An!roi! &( a!&: ./adb push /home/USER/beagleboneblack/deviceTestProject/libs/armeabi/deviceTest /etc/ .:B )o to An!roi! console an! e"ec$te !e,iceTest program: ./ a!& shell c! etc chmo! 111 !e,iceTest ./!e,iceTest *rogram=s +$tp$t will &e: Driver Test Read msg: Hello from module ioctl OK 8ernel log=s +$tp$t will &e: <6>[ 5295.389801] androidCustomModule> (int_module) loaded OK <6>[ 5309.067596] androidCustomModule> (open) minor=0 OK <6>[ 5309.074859] androidCustomModule> (read) minor: 0 <6>[ 5309.080596] androidCustomModule> (write) minor: 0 <6>[ 5309.085845] androidCustomModule> (write) msg:Message from user <6>[ 5309.092895] androidCustomModule> (ioctl) minor: 0 <6>[ 5309.098052] androidCustomModule> (ioctl) CMD: 1 <6>[ 5309.103607] androidCustomModule> (release) minor=0 OK Consi!erations #f we nee! o$t c$stom !e,ices alwa(s a,aila&le7 we nee! to call @install0o!$le.shA script when An!roi! is &ooting7 this is possi&le a!!ing it to the &oot script we alrea!( ma!e.
UTN FRA LSL http://www.lslfra.com.ar .. Android on Beaglebone Black (Rev 2) T#torial %$& Accessing to har!ware from c$stom An!roi! !ri,er. Re9$irements: C$stom !ri,er m$st alrea!( wor'. Until now7 o$r !ri,er Q$st can manage a local ram memor( portion witho$t interaction with har!ware7 if we want to rea!/write processor=s registers for controlling har!ware mo!$les we can not !o this !irectl(7 we nee! to $se f$nctions to con,ert ph(sical a!!resses to ,irt$al a!!resses. Steps 1B Use @re9$est>mem>regionA f$nction to reser,e ph(sical a!!resses for accessing. This reser,ation sho$l! &e !one in mo!$le=s init f$nction. str$ct reso$rce Kres E re9$est>mem>regionJ*WDS>AR7;7Farea>nameFBS ifJresVENULLB G // Reser,ation +8 I #n this e"ample7 we are reser,ing ; &(tes starting from a!!ress @*WDS>ARA an! we are assigning to this area the name @area>nameA 5hen memor( area is reser,e!7 we can chec' that $sing: cat /proc/iomem .B Same wa(7 we sho$l! release this memor( area in mo!$le=s close f$nction: release>mem>regionJ*WDS>AR7;BS 3B Now we can o&tain a pointer for rea!/write $sing @ioremap>nocacheA f$nction $nsigne! int K a!!r E J$nsigne! int KBioremap>nocacheJ*WDS>AR7;BS ;B Using iorea!3. an! iowrite3. we can rea!/write this memor( a!!ress: $nsigne! int ,al$e E iorea!3.Ja!!rBS ,al$eE,al$e Y J1RR.1BS iowrite3.J,al$e7a!!rBS 2B Release the pointer: io$nmapJa!!rBS This wa( we can rea!/write ph(sical a!!resses in o$r !ri,er an! $se processor=s har!ware. This hea!ers files m$st &e incl$!e!: Mincl$!e Rlin$"/ioport.hN Mincl$!e Rasm/io.hN UTN FRA LSL http://www.lslfra.com.ar .3 Android on Beaglebone Black (Rev 2) T#torial %%& Compiling 'ernel 3.4 with !e,ice tree s$pport for An!roi!. 8ernel 3.. !oes not ha,e e,ice Tree s$pport7 we cannot $se *50 mo!$le or AC if we !o not initiali-e these mo!$les $sing e,ice Tree7 &eca$se of this7 we are going to left T# 'ernel an! files(stem asi!e7 an! we are going to $se row&oat proQect to compile An!roi! an! Ro&ert Nelson=s 'ernel 3.4. Steps 1B Fetch row&oat=s An!roi! proQect for %%%: mkdir RobertNelsonKernel cd RobertNelsonKernel repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-jb-am335x.xml repo sync .B Fetch an! compile Ro&ert Nelson 8ernel git clone https://github.com/RobertCNelson/bb-kernel.git cd linux-dev git checkout origin/am33x-v3.8 -b tmp ./build_kernel.sh 8ernel compilation will start an! we will ha,e to a!! some feat$res in 'ernel=s men$config: e,ice ri,ers 6N TKU Staging !ri,ers 6N An!roi! 6N RKN An!roi! log !ri,er 3B Now we are going to fetch An!roi!=s &ootloa!er @U6%ootA. #n Ro&ertNelson8ernel !irector(: git clone git://git.denx.de/u-boot.git cd u-boot/ git checkout v2013.04 -b tmp wget https://raw.github.com/eewiki/u-boot-patches/master/v2013.04/0001-am335x_evm-uEn v.txt-bootz-n-fixes.patch patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch ;B 5e compile U6&oot with the following comman!s: make ARCH=arm CROSS_COMPILE=~/RobertNelsonKernel/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4 .7-2013.04-20130415_linux/bin/arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=~/RobertNelsonKernel/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4 .7-2013.04-20130415_linux/bin/arm-linux-gnueabihf- am335x_evm_config make ARCH=arm CROSS_COMPILE=~/RobertNelsonKernel/linux-dev/dl/gcc-linaro-arm-linux-gnueabihf-4 .7-2013.04-20130415_linux/bin/arm-linux-gnueabihf- UTN FRA LSL http://www.lslfra.com.ar .; Android on Beaglebone Black (Rev 2) 2B Now we nee! to compile An!roi! Files(stem $sing o$r new 8ernel 3.47 for that reason we nee! to change 'ernel lin' in row&oat proQect: cd rowboat-android mv kernel kernel.backup ln -s ~/RobertNelsonKernel/linux-dev/KERNEL kernel An! we nee! to !o some mo!ifications in ma'efile: chmod 644 Makefile 5e nee! to locate the following line: e"port *ATW :E\J*ATWB:\JANR+#>#NSTALL>#RB/pre&$ilts/gcc/lin$"6"4:/arm/arm6ea&i6;.:/&in Comment o$t that line an! replace it with the following: export PATH : =~/RobertNelsonKernel/linux-dev/dl/gcc-linaro-ar-linux-gnueabi!"-#$%-&'()$'#-& '()'#(*+linux/bin:,-PATH. export //+PR0123 := ar-linux-gnueabi!"- Now locate this line: \J0A8/B 6C har!ware/ti/wlan/mac4<.11/compat>wl14"" ANR+#>R++T>#RE\ JANR+#>#NSTALL>#RB CR+SS>C+0*#L/Earm6ea&i6 ARCWEarm install An! we nee! to replace it for: \J0A8/B 6C har!ware/ti/wlan/mac4<.11/compat>wl14"" ANR+#>R++T>#RE\ JANR+#>#NSTALL>#RB CR+SS>C+0*#L/E\JCC>*R/F#CB ARCWEarm install Now we can compile An!roi!=s files(stem7 (o$ can a!! =6Q.= or =6Q;= if (o$ ha,e man( cores in (o$r comp$ter7 this will acelerate the process. make TARGET_PRODUCT=beagleboneblack OMAPES=4.x droid :B #n this step we are going to create the root files(stem. #n row&oat6an!roi! !irector(: cd out/target/product/beagleboneblack mkdir android_rootfs cp -r root/* android_rootfs cp -r system android_rootfs cd android_rootfs/system tar -xvzf ~/RobertNelsonKernel/linux-dev/deploy/*modules.tar.gz Ass$ming that we are still in the o$t/target/pro!$ct/&eagle&one&lac' !irector(7 we nee! to &ac'$p the file an!roi!>rootfs/init3rc an! then open it in a te"t e!itor7 we are going to to change init.rc file: #n the line: import /init.\Gro.har!wareI.rc UTN FRA LSL http://www.lslfra.com.ar .2 Android on Beaglebone Black (Rev 2) we are going to change it &(: import /init.am332"e,m.rc Then7 we nee! to change the file an!roi!>rootfs/ftab3a/'').ev/7 the first line is: /!e,/&loc'/platform/omap/omap>hsmmc.</mmc&l'<p3 an! we will change it &(: /!e,/&loc'/mmc&l'<p3 Now we nee! to !isa&le graphical aceleration in file an!roi!>rootfs/s(stem/b#ild30ro0 &eca$se this is not a,aila&le in 3.4 'ernel. !e&$g.egl.hwE< video$accelerate$!4=' Finall(7 in the o$t/target/pro!$ct/&eagle&one&lac' !irector(7 we e"ec$te: ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2 The rootfs.tar.&-. file will &e create!. This is the An!roi!=s files(stem we are going to $se. 1B Now we are going to create an @imageA !irector( an! gather all necessar( files there: cd ~/RobertNelsonKernel mkdir image cp rowboat-android/external/ti_android_utilities/am335x/mk-mmc/* image cp rowboat-android/out/target/product/beagleboneblack/rootfs.tar.bz2 image cp u-boot/MLO image cp u-boot/u-boot.img image cp linux-dev/KERNEL/arch/arm/boot/zImage image cp linux-dev/KERNEL/arch/arm/boot/dts/am335x-boneblack.dtb image 4B 5e nee! to create $6&oot config$ration file $/n,.t"t in image !irector( with the following content: 'ernel>fileE-#mage console=tt56'7((*&''n8 croot=/dev/cbl9'p& r4 croot"st5pe=ext# root4ait load9ernel=load c ,:cdev;:,:cpart; 'x8'&''''' ,:9ernel+"ile; load"dt=load c ,:cdev;:,:cpart; 'x8(*"'''' ,:"dt"ile; boot+"td=run load9ernel< run load"dt cargs=setenv bootargs consoleblan9=' console=,:console; androidboot$console=tt56' e=*(&= root=,:croot; root"st5pe=,:croot"st5pe; init=/init ip=o"" video=%&'x#8'-(>?>' @eu=( vt$global+cursor+de"ault=' uenvcd=run boot+"td< run cargs< bootA 'x8'&''''' - 'x8(*"'''' UTN FRA LSL http://www.lslfra.com.ar .: Android on Beaglebone Black (Rev 2) PB 5e can create o$t $S car! now. First we nee! to 'now what s!C o$r s! car! is. Then we are going to r$n the script m'mmc6an!roi!.sh cd image ./mkmmc-android.sh [YOUR DEVICE FILE FOR THE MICROSD CARD] MLO u-boot.img zImage uEnv.txt rootfs.tar.bz2 1<B Now we mo$nt @&ootA partition of o$r s! car! an! we !o these changes: cd /media/boot sudo mv uImage zImage sudo cp ~/RobertNelsonKernel/image/am335x-boneblack.dtb . sync 5e a!!e! !e,ice tree file an! we change! $#mage for -#mage. Now o$r $S car! is rea!( to r$n An!roi! with 'ernel 3.4 an! !e,ice tree s$pport. N?TE& a!& !oes not wor' &( US%7 we nee! to connect %eagle&one %lac' $sing /thernet connector. UTN FRA LSL http://www.lslfra.com.ar .1 Android on Beaglebone Black (Rev 2) T#torial %2& Using *50 mo!$les. Re9$irements: Ro&ert Nelson 3.4 8ernel compile!. An!roi! r$nning with Ro&ert Nelson 3.4 8ernel an! e,ice Tree 5e nee! An!roi! r$nning with 'ernel 3.4 for $sing *50 mo!$les &eca$se of we are going to ena&le *50 $sing !e,ice tree. 5e ha,e 4 *50 o$ts: =5N =<@ n#/ber *P 6 .. *50< *P 6 .1 *501 *P 6 ;. *50. *P 6 1; *503 *P 6 1: *50; *4 6 1P *502 *4 6 13 *50: *P 6 .4 *501 Steps 1B First of all we nee! to install the pwm 'ernel mo!$le $sing @insmo!A comman!. This mo!$le is in /s(stem/li&/mo!$les/3.4.136&one;<.1/'ernel/!ri,ers/pwm/ an! it is calle! @pwm>test.'oA. insmod /system/lib/modules/3.8.13-bone40.1/kernel/drivers/pwm/pwm_test.ko .B Using !e,ice tree now we can ena&le *50 s$pport: echo am33xx_pwm > /sys/devices/bone_capemgr.9/slots 3B *50 mo!$le is rea!( to $se. Now we can e"port *50 o$ts as we !i! with )*#+s. #f we want to ena&le *50: we nee! to write: echo 6 > /sys/class/pwm/export echo bone_pwm_P8_13 > /sys/devices/bone_capemgr.*/slots 5here @:A is for *50: an! @&one>pwm>*4>13A is &eca$se of *50: correspon!s with *4>13. ;B Now @pwm:A !irector( will appear7 we will fin! there fo$r important files: 0eriod8n: Were we set pwm=s perio! in nanosecon!s. d#t68n: Were we set pwm=s !$t( in nanosecon!s. 0olarit6: Were we set pwm=s polarit(.. r#n: 5hen we write @1A *50 starts r$nning7 an! when we write @<A *50 stops. UTN FRA LSL http://www.lslfra.com.ar .4 Android on Beaglebone Black (Rev 2) 2B Finall(7 we change files=s permissions to :::7 in this wa( we can write these files $sing a C program or &( &ash console. chmod 666 pwm/pwm6/period_ns chmod 666 pwm/pwm6/duty_ns chmod 666 pwm/pwm6/polarity chmod 666 pwm/pwm6/run The follow &ash script installs pwm mo!$le an! ena&les all *50 o$ts7 we can r$n it on An!roi!=s initiali-ation. MV/s(stem/&in/sh M#!entif( &one ,ersion mo!$leE\Jecho /s(stem/li&/mo!$les/3.4.136&oneK/'ernel/!ri,ers/pwm/pwm>test.'o Y /!ata/&$s(&o"/&$s(&o" aw' =Gprint \1I=B Mloa! pwm mo!$le insmo! \mo!$le M #!entif( cape6manager slots slotE\Jecho /s(s/!e,ices/&one>capemgr.K/slots Y /!ata/&$s(&o"/&$s(&o" aw' =Gprint \1I=B pwmE/s(s/class/pwm/ M Loa! *50 mo!$le if T \Jcat \slot Y grep am33"">pwm 6cB 6gt < US then echo am33"">pwm alrea!( loa!e!7 not loa!ing againS else echo /na&ling *50 !ri,er am33"">pwm echo am33"">pwm N \slot fiS M Safe pins that won=t interfere with one another MportsEJ*P>.. *P>;. *P>1: *4>13 *P>.4BS Mportn$m&ersEJ< . ; : 1BS MF$ll correspon!ence from pwm<6pwm1 portsEJ*P>.. *P>.1 *P>;. *P>1; *P>1: *4>1P *4>13 *P>.4BS portn$m&ersEJ< 1 . 3 ; 2 : 1BS M /na&le *50 pins M The( m$st &e e"porte! at this stage7 &efore the !e,ice tree M o,erla( for that pin is ena&le!. cE< while T c 6lt \GMportsTKUI U !o if T V 6! \pwm/pwm\Gportn$m&ersT\cUI US then echo /"porting *50 \Gportn$m&ersT\cUI [J\GportsT\cUI[B echo \Gportn$m&ersT\cUI N \pwm/e"port chmo! ::: \pwm/pwm\Gportn$m&ersT\cUI/perio!>ns chmo! ::: \pwm/pwm\Gportn$m&ersT\cUI/!$t(>ns chmo! ::: \pwm/pwm\Gportn$m&ersT\cUI/polarit( chmo! ::: \pwm/pwm\Gportn$m&ersT\cUI/r$n else echo *50 \Gportn$m&ersT\cUI alrea!( ena&le! fiS if T \Jcat \slot Y grep \GportsT\cUI 6cB 6gt < US then echo *50 pin \GportsT\cUI alrea!( ena&le!7 not ena&ling again else Jecho &one>pwm>\GportsT\cUI N \slotB 1NX. NN /!e,/n$ll fiS cE\JJcL1BB !one 5e can change which *50 mo!$les we want to initiali-e UTN FRA LSL http://www.lslfra.com.ar .P Android on Beaglebone Black (Rev 2) T#torial %'& Using AC mo!$le. Re9$irements: Ro&ert Nelson 3.4 8ernel compile!. An!roi! r$nning with Ro&ert Nelson 3.4 8ernel an! e,ice Tree %eagle&one &lac' has 1 analog inp$ts7 we nee! to ena&le them if we want to $se them. Analog inp$ts !ri,er is similar to )*#+ !ri,er7 we will rea! a file where the analog ,al$e is. 5e will ha,e a file for each inp$t7 the ,al$e is a n$m&er &etween < an! ;<P2 J1. &it resol$tionB. 5e ha,e 1 Analog inp$ts: =5N Analog n#/ber *P 6 3P A#N< *P 6 ;< A#N1 *P 6 31 A#N. *P 6 34 A#N3 *P 6 33 A#N; *P 6 3: A#N2 *P 6 32 A#N: Steps 1B /na&le analog inp$ts $sing !e,ice tree: echo BB-ADC > /sys/devices/bone_capemgr.*/slots .B Now we will fin! 1 files in @/s(s/&$s/platform/!ri,ers/&one6iio6helper/helper.12A A#N< to A#N:. #f we want to rea! Analog < inp$t we can $se @catA comman!: cd /sys/bus/platform/drivers/bone-iio-helper/helper.15 cat AIN0