车联网之基于Omap4 Andriod系统移植的行车电脑终端

       本文主要是以一个早期的移动终端产品案例进行简要地系统移植分析,其中牵涉到多个硬件模块的驱动、framework、app移植与实现。

一.x-loaderu-boot移植

       OMAP平台的启动初始化(bootloaders)依次分为了几个的阶段,其启动顺序为:ROM代码、x-loaderu-bootkernel,如下图所示:

 

1

1.      x-loader

a)      x-loader代码流程

                                                                                                                         

 

2

b)      编译x-loader

 

make distclean  

make ARCH=arm omap44XXpanda_config

make ift 2>&1 |tee  $MYDROID/logs/x-loader_make.out

 

2.      u-boot

a)      u-boot代码流程

 

3

b)      编译u-boot

 

make distclean

make ARCH=arm omap44XXpanda_config

make 2>&1 |tee $MYDROID/logs/u-boot_make.out

        

二.eMMC

        eMMC ( Embedded Multi Media Card)采用统一的MMC标准接口,文件系统可以在eMMC方式存储。cardcorehost这三层的关系如下图:

                                                               

4

      驱动程序:

1.      u-boot

 

//board\omap44xxpanda\mmc.c

//mmc_read(0)的代码改成mmc_read(mmc_slot);

2.      kernel

 

//arch\arm\mach-omap2\board-omap4panda.c

//添加emmc设备,mmc为2

{

.mmc             =  2,

.caps            =  MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,

.gpio_wp =  -EINVAL,

.gpio_cd =  -EINVAL,

},

 

//arch\arm\mach-omap2\board-44xx-power.c

//添加设备电源

REGULATOR_SUPPLY("vmmc",  "omap_hsmmc.1"),

        

三.系统分区

    Android 系统分为7个区,依次为xloader、bootloader、recovery、boot、system、cache、userdata。使用fastbootoemformat来分区系统,代码位置在uboot

Board\omap44xxpanda\mmc.c

 

static struct partition partitions[] = {

         {  "-", 128 },

         {  "xloader", 128 },

         {  "bootloader", 256 },

         {  "-", 512 },

         {  "recovery", 8*1024 },

         {  "boot", 8*1024 },

         {  "system", 512*1024 },

         {  "cache", 256*1024 },

         {  "userdata", 0},

         {  0, 0 },

};

对应的文件如下:

Xloader:                             MLO

Bootloader:                         u-boot.bin

Recovery:                                   recovery.img

Boot:                                       boot.img(kernel+ramdisk)

System:                            system.img

Cache                                       cache.img

Userdata                           userdata.img

 

 

四.Busybox

        BusyBox可以被自定义化以提供一个超过两百种功能的子集。其属于操作系统上的命令程序。

 

5

        BusyBox直接放在Android源码目录下,即可一同编译经android系统内,步骤如下:

1.      获取源码,并编译

 

wgethttp://busybox.net/downloads/busybox-1.20.2.tar.bz2 ./

tar xvfbusybox-1.20.2.tar.bz2

cd busybox; make;

2.      拷贝到android系统

 

cp–a bin android\device\ti\panda

修改android\device\ti\panda\device.mk

 

$(shell mkdir  out/target/product/panda/system/bin/ -p)

$(shellcp  device/ti/panda/busybox out/target/product/panda/system/bin/ -R)

$(shell cp  device/ti/panda/busybox/bin/chat out/target/product/panda/system/bin/ -R)

 

3.      修改android环境变量

 

#修改system\core\rootdir\init.rc

export PATH  /system/bin/busybox/bin:/system/bin/busybox/sbin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

 

五.3G电话模块

       通讯模块主要实现底层硬件驱动及RIL框架的支持,RILAndroid体系的位置如下:

 

 

6

       移植3G模块,步骤如下:

a)      移植预编译好的中间层库lib3G-ril-android4.0.4.so到Android系统;

b)      修正ttyUSB的端口权限

#vim ./device/ti/panda/ueventd.omap4pandaboard.rc

/dev/ttyUSB* 0777systemsystem

c)      加入ip-upetc/ppp/

#vim ./device/ti/panda/device.mk

device/ti/panda/ip-up:system/etc/ppp/ip-up \

d)      增加message apk

#vim ./device/ti/panda/device.mk

PRODUCT_PACKAGES += \

Mms

e)      添加pppdchat的权限

#vim ./system/core/include/private/android_filesystem_config.h

{ 04777, AID_ROOT,      AID_RADIO,     "system/bin/pppd" },

{ 04777, AID_ROOT,      AID_RADIO,     "system/bin/chat" },

 

六.WIFI模块

7

1.      WIFI驱动

 

a)  Networking support --->

<*>Generic IEEE 802.11 Networking  Stack(mac80211)

b)   Device Drivers --->

<*>MMC/SD/SDIO card support --->

<*>TI OMAP Multimedia Card Interface  support

<*>TI OMAP High Speed Multimedia Card  Interface support

c)  [*] Network device support --->

            [*] Wireless LAN  --- >

                 [*]IEEE 802.11 for Host AP(Prism2/2.5/3 and WEP/TKIP/CCMP)

 

2.      Android修改

a)        支持WIFI

#vim BoardConfig.mk

BOARD_WPA_SUPPLICANT_DRIVER := WEXT

b)        添加WIFI服务

#vim init.omap4pandboard.rc

 

Service wpa_supplicant  /system/bin/wpa_supplicant–Dwext–imlan0 –dd–c  /data/\

Misc/wifi/wpa_supplicant.conf

Group system wifiinet

Socket   wpa_mlan0 dgram 0666 wifiwifi

Disabled

Oneshot

Service dhcpcd_mlan0 /system/bin/dhcpcd–f  /system/etc/dhcpcd/dhcpcd.conf–d –B mlan0

Class main

Group system dhcpwifi

Disabled

Oneshot

        在/system/etc/dhcpcd/添加dhcpcd.conf文件,在system/etc/wifi/添加wpa_supplicant.conf文件,内容参考Android/external/wpa_supplicant/下这个两个文件。

c)        修改wifi.c文件,将关于wlan0的替换成mlan0, 将加载的驱动替换我们自己需要替换的驱动名字

d)        将三合一固件拷贝到/system/etc/fireware/mrvl下

七.Bluetooth模块

 

 

8

1.      Bluetooth驱动

 

[*]Networking support --->

<*> Bluetooth subsystem support  --->

<*>Bluetooth subsystem support

          Bluetooth device drivers   --->

<*>HCI SDIO driver

<*>HCI VHCI(virtual HCI device)driver

 

2.      修改android中间层

a)        generic.mk增加:

 

BOARD_HAVE_BLUETOOTH  := true

b)        init.rc中添加蓝牙服务

 

Service dbus /system/bin/dbus-daemon –system –nofork

         Class main

Socket dbus stream 0660 bluetoothBluetooth

User  Bluetooth

Group Bluetoothnet_bt_admin

Service bluetoothd /system/bin/bluetoothd–n

Class main

Socket Bluetooth stream 0660 bluetoothBluetooth

Socket dbus_bluetooth stream 0660 bluetoothBluetooth

3.      init.rc中添加加载驱动

 

Insmod bt8xxx.ko

 

八.FM模块

        FM模块是BCM3合一内部集成的一个子模块,FM功能在Android框架中如下图,

9

 

      对于FMAPP而言,APP调用JNI接口应同步更新实现。

九.LCD模块

 

10

1.      初始化寄存器。

       使用spi接口,修改u-bootdss驱动。

2.      内核移植

a)        添加lcd设备

//kernel\arch\arm\mach-omap2\board-omap4panda.c

static structpanel_generic_dpi_datalcd_panel =  {

……

};

static structomap_dss_device  omap4_panda_lcd_device = {

……

};

添加lcd时序

 

//kernel\drivers\video\omap2\displays\panel-generic-dpi.c

/* ld070ws2 */

{

……},

十.触摸屏

     触摸屏设备功能框架图如下:

11

3.      触摸屏驱动

a)      硬件

     兼容TSC200X驱动电阻触摸屏

b)      驱动程序

     添加触摸屏驱动,kernel中加入tsc驱动。

 

Device Driver --->

Input device support  --->

                         Touchscreens  --->

                                  [*] TSCbased touchscreens

 

//添加设备

struct tsc_platform_data tsc_info = {

  …..

};

staticstructi2c_board_info ts_i2c_clients []= {

….

}

 

//for tsctouchScreen

omap_register_i2c_bus(2,400, ts_i2c_clients, ARRAY_SIZE(ts_i2c_clients));           

 

4.      触摸屏校准

a)      算法:

      设dx[3]dy[3]LCD显示的三点坐标数组, tx[3]ty[3]为获取的触摸坐标数组。根据采用三点校准算法,求得7个校准参数:

 

a = (tx[0] - tx[2]) * (ty[1] - ty[2])- (tx[1]  - tx[2]) * (ty[0] - ty[2]);

b = (dx[0] - dx[2]) * (ty[1] - ty[2])- (dx[1]  - dx[2]) * (ty[0] - ty[2]);

c = (tx[0] - tx[2]) * (dx[1] - dx[2])- (tx[1]  - tx[2]) * (dx[0] - dx[2]);

d = dx[0] * (tx[1] * ty[2] - tx[2] * ty[1])  -dx[1] * (tx[0] * ty[2] - tx[2] * ty[0]) +dx[2] * (tx[0] * ty[1] - tx[1] *  ty[0]);

e = (dy[0] - dy[2]) * (ty[1] - ty[2])- (dy[1]  - dy[2]) * (ty[0] - ty[2]);

f = (tx[0] - tx[2]) * (dy[1] - dy[2])- (tx[1]  - tx[2]) * (dy[0] - dy[2]);

g = dy[0] * (tx[1] * ty[2] - tx[2] * ty[1])  -dy[1] * (tx[0] * ty[2] - tx[2] * ty[0]) +dy[2] * (tx[0] * ty[1] - tx[1] *  ty[0]);

 

       校准后的坐标为:xtmp, ytmp未触摸屏原始坐标,则校准后的坐标为:

x = a * (int) xtmp +

b * (int)ytmp+c;

x /= g;

y = d* (int)xtmp + e* (int)ytmp + f;

y /= g;

 

b)      处理流程

12

十一. GPS

          Android GPS架构如下图:

13

读取数据的流程图如下:

14

降压降频

     由于产品受使用环境影响,故需要对cpu温度上限控制。由温度传感器来控制cpu过热降频,对于上层Android没有应用接口,是对于CPU频率控制的一种基本方法,其流程如下图:

 

 

15

1.      设置CPU默认温度值

       drivers\misc\omap_temp_sensor.c最低和最高电压调为 71/73摄氏度。

2.      降低电压与cpu频率

//line 226

降压如下:

#define OMAP4460_VDD_MPU_OPPNITRO_UV                1375000

#define OMAP4460_VDD_MPU_OPPNITROSB_UV              1375000

降频如下:

修改arch\arm\mach-omap2\opp4xxx_data.c

//line 322

OPP_INITIALIZER("mpu",  "virt_dpll_mpu_ck", "mpu", true, 1200000000, OMAP4460_VDD_MPU_OPPNITRO_UV),

/* MPU OPP4 - OPP-Nitro SpeedBin */

//OPP_INITIALIZER("mpu",  "virt_dpll_mpu_ck", "mpu", true, 1500000000,  OMAP4460_VDD_MPU_OPPNITROSB_UV),

十三. Camera模块

       在Camera系统的各个库中,libui.so对上层的提供的接口主要是Camera类,类libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera类。

 

         16

1.      内核移植

使得内核支持UVC(USBvideo device class)驱动及V4L2(Video4Linux 2)驱动。

Symbol: USB_VIDEO_CLASS [=y]

Depends on: MEDIA_SUPPORT [=y] &&  VIDEO_CAPTURE_DRIVERS [=y] && VIDEO_V4L2 [=y] && V4L_USB_DRIVERS  [=y] && USB [=y]

Location:                                                                -> Device Drivers                                                                        

-> Multimedia support (MEDIA_SUPPORT  [=y])                                              

-> Video capture adapters  (VIDEO_CAPTURE_DRIVERS [=y])                                

-> V4L USB devices (V4L_USB_DRIVERS [=y])

//

Symbol: USB_VIDEO_CLASS_INPUT_EVDEV [=y]

Depends on: MEDIA_SUPPORT [=y] &&  VIDEO_CAPTURE_DRIVERS [=y] && VIDEO_V4L2 [=y] &&  V4L_USB_DRIVERS [=y] && USB [=y]&& UVC[=y]

Location:                                                                                       -> Device Drivers                                                                                                       

-> Multimedia support (MEDIA_SUPPORT  [=y])                                                                            

-> Video capture adapters  (VIDEO_CAPTURE_DRIVERS [=y])                                

-> V4L USB devices (V4L_USB_DRIVERS  [=y])                                                                         

-> USB Video Class (UVC) (USB_VIDEO_CLASS  [=y])

2.      Android移植

a)        HAL

移植camera.panda.so,配置USB Camera分辨率、预览、拍照、录像HAL接口

./hardware/ti/omap4xxx/camera

b)        Frameworks

实现JNI接口:

./frameworks/base/core/jni/android_hardware_Camera.cpp

实现FrameworksCameraService取景Preview、拍照takePicture以及摄影Recording功能:

./frameworks/base/services/camera

              另外实现development

./development/tools/emulator/system/camera

 

十四.        Omx解码框架

         TIOpenMax 1L层主要包括有:

1.      System  : OpenMax核心和公共部分;

2.      Audio   : 音频处理部分的OpenMax1L组件;

3.      Video   : 视频处理部分的OpenMax1L组件;

4.      Image  : 图像处理部分的OpenMax1L组件;

 

17

十五.        音频模块

         Android的音频子系统集中在Framework层,其中除了MeidaServer外还包括AudioFlingerAudioTrackAudioFlingerAudioPolicyServiceAudioPolicyManager等子模块。子系统框架图如下所示:

18

      音频移植部分集中主要集中在KernelSOC驱动和HAL中间件层。根据产品需求定义需要实现多通道输出输出:

输入:3G_phoneBluetooth_micFMMic

输出:3G_micBluetooth(hs)Speaker

1.      内核移植

c)        ABE移植,实现多通道输出输出切换、关闭、打开、连接,主要移植的源码有一下几个模块:

./sound/soc/contorl.c

./sound/soc/soc_damp.c

./sound/soc/codecs/twl6040.c

./sound/soc/omap/omap-abe-dsp.c

./sound/soc/omap/omap-abe.c

./sound/soc/omap/abe/

2.      HAL

        根据上层的音频策略打开/关闭相应的pcm设备及设置音频输入输出路径,修改以下源码。

./hardware/libhardware_legacy/audio/audio_hw.c

 

十六.   小键盘模块

       小键盘的实现可以采用通用的GPIOButtons驱动实现,对于Android上层Frameworks而言,跟触摸屏差异不大。GPIOButtonsAndroid体系中如下:

19

1.      内核驱动

Symbol: KEYBOARD_GPIO [=y]

Depends on: !S390 && INPUT [=y]  && INPUT_KEYBOARD [=y] && GENERIC_GPIO [=y]                                               

Location:                                                                                 -> Device Drivers                                                                                                       

-> Input device support                                                                                               

-> Generic input layer (needed for  keyboard, mouse, ...) (INPUT [=y])                 

-> Keyboards (INPUT_KEYBOARD [=y])

2.      定义键值

arch/arm/mach-omap2/board-omap4panda.c定义键值并主持设备

static structgpio_keys_buttongpio_buttons[] =  {

          GPIO_BUTTON(GPIO_KEY0,KEY_POWER, 1, "power", 0),

          GPIO_BUTTON(GPIO_KEY1,KEY_BACK, 1, "back", 0),

          GPIO_BUTTON(GPIO_KEY2,KEY_HOME, 1, "home", 0),

……

};

static structgpio_keys_platform_datagpio_button_data  = {

   .buttons      = gpio_buttons,

          .nbuttons    = ARRAY_SIZE(gpio_buttons),

};

//注册设备

platform_device_register(&gpio_button_data);

    其次,通过/system/usr/keylayout/gpio-keys.kl文件实现android标准键值映射即可。

十七.        PWM背光驱动

     Android通过backlight设备节点来控制LCD背光亮度,其大致框架如下图所示:

 

20

1.      内核驱动

Symbol: LEDS_OMAP4430_SDP_DISPLAY [=y]

Depends on: NEW_LEDS [=y] &&  LEDS_CLASS [=y]                                                 

Location:                                                                                                                 

-> Device Drivers                                                                          

-> LED Support (NEW_LEDS [=y])

Selected by: MACH_OMAP_4430SDP [=n] &&  ARCH_OMAP2PLUS [=y] && ARCH_OMAP4 [=y] || MACH_OMAP_BLAZE [=n] &&  ARCH_OMAP2PLUS [=y] && ARCH_OMAP4 [=y]

2.      注册设备

static struct  omap4430_sdp_disp_led_platform_data omap4_panda_disp_led_data = {

         .flags  = LEDS_CTRL_AS_ONE_DISPLAY,

         .display_led_init  = omap4_panda_init_display_led,

         .primary_display_set  = omap4_panda_set_primary_brightness,

         .secondary_display_set  = omap4_panda_set_secondary_brightness,

};

static structplatform_device  omap4460_backlight_device = {

         .name    =        "display_led",

         .id      =        -1,

         .dev     = {

                 .platform_data  = &omap4_panda_disp_led_data,

         },

};

//注册设备

platform_device_register(&omap4460_backlight_device);

3.      HAL

修改HAL的设备符

// ./hardware/msm7k/liblights/lights.c

/*

char const*const LCD_FILE

= "/sys/class/backlight/pwm-backlight/brightness";

*/

 

char const*const LCD_FILE

         = "/sys/class/leds/lcd-backlight/brightness";

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言: 在淘宝搜了一圈,感觉成品的行车电脑,功能大多不实用。大部分都是基于标准的OBD协议进行开发,功能无非就是查看故障码、清除故障码、显示转速、车速、水温、进气压力、进气温度等等的一些发动机参数。其实这些参数如果不是维修的话,日常行车基本上没用的。 于是萌发了自己制作一款多功能行车电脑的念头。于是开始查资料、研究车辆的OBD协议,设计线路板、编程、调试,经过1年多的时间,经过了3个版本的修改,最终做成了现在的这款行车电脑。自我感觉还不错,用的效果也很好。现在开源出来给大家。 OBD行车电脑放在车上的效果: 整个系统采用ATmega64作为主控芯片,用24064的黄绿液晶作为显示屏(T6963C驱动),DS1302作为时钟芯片,读取时间。用2个DS18B20温度传感器检测车内及车外温度,用C3-370C的GPS模块作为GPS接收装置,读取经纬度、海拔、航向等信息。在发动机的OBD接口上安装一个蓝牙的OBD模块(买的),系统板上也采用一个蓝牙串口模块,系统板和车辆之间通过蓝牙串口来透明的传输发动机数据。电源采用的是LM2596,其实整机功耗不大,用7805也可应付。按键采用的是4个独立按键(上图搞错了)其实这4个按键我借用了乐风的电控后视镜按钮。(我的车是低配,是手动调节后视镜,但是有安装电调后视镜按钮的位置。所以我买了一个后视镜调节按钮,当作了系统的按键)。系统板上留出了ISP接口和JTAG接口,方便下载程序和在线调试。 目前实现的功能: 1.车速的实时显示。(这个是实际的车速,而不是表速。表速根据国标规定,比实际速度低一些) 2.超速报警功能。(设定一个报警值,当车速超过以后,蜂鸣器报警。可用按键关闭。高速上开车相对方便) 3.小计里程统计。(车速表上的小计里程一般最大统计1000Km,这个可以统计65535Km。可通过长按下键来清零) 4.每月行驶里程统计。(统计每个月的行驶里程,并可显示。每月自动清零,不可手动清零) 5.本次行驶平均油耗统计。(显示本次行驶的平均油耗,单位是 L/100Km) 6.历史平均油耗统计。(车辆在一个大的用车时间内的平均油耗) 7.剩余燃油续航里程。(根据当前的油耗计算出的油箱内燃油还能跑多少公里) 8.当前行驶方向。(分八个方向显示。东、西、南、北、东南、东北、西南、西北) 9.当前位置经纬度坐标。(度、分、秒格式) 9.当前位置海拔高度。 10.时间及日期显示(年、月、日、星期、时、分、秒根据GPS自动校时,无需手动调整) 11.车内温度显示。 12.车外温度显示。 13.本次行程统计。(在本次行车停车关机时显示,显示的信息有:本次行驶时间、本次行驶里程、本次行驶平均油耗、本次行驶最高速度、本次行驶平均速度) 14.最高速度记录。(记录开车的最高速度) 15.加油记录。(每次加油后,开机时可自动识别出加油,可记录本次加油单价、加油量、总价、加油时间) 16.用油统计。(可统计自某个时间以来,总的加油量、总天数、总行驶里程、总加油费用、总的平均油耗、平均费用,包括每天的费用和每公里费用) 17.根据环境光线,自动开启仪表照明。(这个功能硬件预留,程序中没设计。后序陆续添加) 先看一下线路板。这个线路板是画好以后在网上找的PCB厂家给做的。当时在验证设计时,曾经用感光法自制过PCB板,专门买了感光蓝油、PCB覆铜板,蚀刻液,用喷墨打印机打印PCB图到感光胶片上,覆盖在涂了感光蓝油的覆铜板上,用台灯曝光15分钟,然后显影、脱膜、蚀刻。效果很好,最小线宽可以做到10mil!但是打孔是个头疼问题。全是1mm一下的孔,太难钻了,而且过孔问题很难解决。所以后来还是让PCB厂家做的板。 下面是用的LCD屏。24064的黄绿点阵。T6963C的控制器。这个屏是我在单位的一台废旧设备上拆下的。工业级的。还不错。 屏和主板是两层设计,中间的是蓝牙串口模块。 下面介绍一下各个界面 第一屏,最常用的信息,开机后就在这个界面 第二屏,主要显示GPS的一些信息。按按钮上的“右”键切换到第二屏。 说明: 程序是用C语言写的。本人水平有限。我自己看着都很乱。附件中含有清晰版的原理图和源程序。用CodeVisionAVR V2.04.4a编译。压缩包内自带工程文件与源文件。编译没有错误,但是有警告。注意源文件中有DS1302.lib和DS18B20.lib两个文件,要拷贝到CodeVisionAVR的安装目录下的lib文件夹内,替换系统自带的两个文件。因为我对这两个文件做了修改。 一直想弄个外壳,在淘宝上找了很久,也没找到合适的外壳。没有外壳就暂时裸奔吧! 说说使用的感受: 1.跑高速时很爽!在这个安装位置正好,需要看时速时眼扫一下就可以,或者设定好超速报警,开就是了,根本不用低头看车速! 2.平均油耗,至少在我的车上还是比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值