Android系统移植与驱动开发概述

一、Android系统架构

Android系统移植与驱动开发概述

1)应用程序层

Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是  用Java语言编写的,并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个性化。

2)应用程序框架层

应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提    供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。

3)系统运行库层         

   从图中可以看出,系统运行库层可以分成两部分,分别是系统库和Android运行时。

4)Linux内核层

Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。

二、Android版本与Linux内核的关系

Android系统移植与驱动开发概述

关于Android对应Linux内核版本,大家可以到自己手机中的设置---关于手机查看

Android系统移植与驱动开发概述

查Linux 系统的内核版本方法:

①uname -a     

uname -a

②cat /proc/version

cat /proc/version

Android系统移植与驱动开发概述

注:/proc 不是普通的文件系统,而是系统内核的映像,也就是说,该目录中的文件是存放在系统内存之中的,它以文件系统的方式为访问系统内核数据的操作提供接
口。而uname 命令就是从/proc/version 文件中获取信息的,当然直接查看/proc/version文件的内容(方法2 )也可以获取同样的信息. uname 命令加上参数“-a” 可以获取更多的信息,否则只显示当前的系统名,也就是只会输出“Linux”.

三、Linux设备驱动

设备的分类:

字符设备

块设备

网络设备

例子(s3c6410小灯):

#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <mach/map.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-m.h>

#define DEVICE_NAME "s3c6410_leds"
#define DEVICE_COUNT 1              //  设备数量
#define S3C6410_LEDS_MAJOR 0 
#define S3C6410_LEDS_MINOR 234
#define PARAM_SIZE  3
static unsigned char mem[4]; // 保存4个Leds的设置状态
static int major = S3C6410_LEDS_MAJOR;
static int minor = S3C6410_LEDS_MINOR;
static dev_t dev_number; //  设备号
static int leds_state = 1;
static char *params[] = {"string1", "string2","string3"};
static int param_size = PARAM_SIZE;

static struct class *leds_class = NULL;

static long s3c6410_leds_ioctl(struct file *filp, unsigned int cmd,
        unsigned long arg)
{

switch (cmd)
    {
        unsigned tmp;

case 0:
        case 1:
        if (arg > 4)
        {
            return -EINVAL;
        }
        tmp = ioread32(S3C64XX_GPMDAT);

if (cmd == 1)
        {
            tmp &= (~(1 << arg));
        }
        else
        {
            tmp |= (1 << arg);
        }

iowrite32(tmp, S3C64XX_GPMDAT);

return 0;
        default:
        return -EINVAL;
    }
}
static ssize_t s3c6410_leds_write(struct file *file, const char __user *buf,
        size_t count, loff_t *ppos)
{

unsigned tmp = count;
    unsigned long i = 0;
    memset(mem, 0, 4);

if (count > 4)
    {
        tmp = 4;
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/96a33a47b79063d50e1a1ae45f36e14d.html