linux系统移植安卓,Android系统移植与驱动开发概述

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

注:/proc 不是普通的文件系统,而是系统内核的映像,也就是说,该目录中的文件是存放在系统内存之中的,它以文件系统的方式为访问系统内核数据的操作提供接

口。而uname 命令就是从/proc/version 文件中获取信息的,当然直接查看/proc/version文件的内容(方法2 )也可以获取同样的信息. uname 命令加上参数“-a” 可以获取更多的信息,否则只显示当前的系统名,也就是只会输出“Linux”.

三、Linux设备驱动

设备的分类:

字符设备

块设备

络设备

例子(s3c6410小灯):

#include

#include

#include

#include

#include

#include

#include

#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

}

else

{

tmp |= (1

}

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;

}

if (copy_from_user(mem, buf, tmp))

{

return -EFAULT;

}

else

{

for (i = 0; i

{

tmp = ioread32(S3C64XX_GPMDAT);

if (mem[i] == ‘1’)

{

tmp &= (~(1

}

else

{

tmp |= (1

}

iowrite32(tmp, S3C64XX_GPMDAT);

}

return count;

}

}

static struct file_operations dev_fops =

{ .owner = THIS_MODULE, .unlocked_ioctl = s3c6410_leds_ioctl, .write =

s3c6410_leds_write };

static struct cdev leds_cdev;

//创建设备文件(/dev/s3c6410_leds)

static int leds_create_device(void)

{

int ret = 0;

int err = 0;

//  初始化cdev的成员,并建立cdev和file_operations之间的连接

cdev_init(&leds_cdev, &dev_fops);

leds_cdev.owner = THIS_MODULE;

if (major > 0)

{

//  获取设备 (主设备 和次设备 )

dev_number = MKDEV(major, minor);

err = register_chrdev_region(dev_number, DEVICE_COUNT, DEVICE_NAME);

if (err

{

printk(KERN_WARNING “register_chrdev_region() failedn”);

return err;

}

}

else

{

err = alloc_chrdev_region(&leds_cdev.dev, 10, DEVICE_COUNT,

DEVICE_NAME);

if (err

{

printk(KERN_WARNING “alloc_chrdev_region() failedn”);

return err;

}

major = MAJOR(leds_cdev.dev);

minor = MINOR(leds_cdev.dev);

//dev_number = MKDEV(major, minor);

dev_number = leds_cdev.dev;

}

ret = cdev_add(&leds_cdev, dev_number, DEVICE_COUNT);

leds_class = class_create(THIS_MODULE, DEVICE_NAME);

device_create(leds_class, NULL, dev_number, NULL, DEVICE_NAME);

return ret;

}

static void leds_init_gpm(int leds_default)

{

int tmp = 0;

//  初始化端口配置寄存器

tmp = ioread32(S3C64XX_GPMCON);

tmp &= (~0xFFFF);

tmp |= 0x1111; // 0001000100010001

iowrite32(tmp, S3C64XX_GPMCON);

//  初始化端口上拉电路寄存器

tmp = ioread32(S3C64XX_GPMPUD);

tmp &= (~0xFF);

tmp |= 0xAA; // 01010101

iowrite32(tmp, S3C64XX_GPMPUD);

//  初始化端口数据寄存器

tmp = ioread32(S3C64XX_GPMDAT);

tmp &= (~0xF);

tmp |= leds_default;

iowrite32(tmp, S3C64XX_GPMDAT);

}

//  初始化LED驱动

static int leds_init(void)

{

int ret;

ret = leds_create_device();

leds_init_gpm(~leds_state);

printk(DEVICE_NAME”tinitializedn”);

printk(“param0t%sn”, params[0]);

printk(“param1t%sn”, params[1]);

printk(“param2t%sn”, params[2]);

return ret;

}

static void leds_destroy_device(void)

{

device_destroy(leds_class, dev_number);

if (leds_class)

class_destroy(leds_class);

unregister_chrdev_region(dev_number, DEVICE_COUNT);

return;

}

static void leds_exit(void)

{

leds_destroy_device();

printk(DEVICE_NAME”texit!n”);

}

module_init(leds_init);

module_exit(leds_exit);

module_param(leds_state, int, S_IRUGO|S_IWUSR);

module_param_array(params, charp, ?m_size, S_IRUGO|S_IWUSR);

MODULE_LICENSE(“GPL”);

MODULE_AUTHOR(“Lining”);

总结一下学习Linux 驱动要做些什么:

1.准备一个自己熟悉的Linux 操作系统,用于开发和测试Linux 驱动,建议使用Ubuntu Linux14.04 及以上版本。

2.准备一块开发板(建议采用基于ARM11的开发板〉。

3.学习GNUC。

4.学习相关的硬件知识。

5.不断地实践。

0b1331709591d260c1c78e86d0c51c18.png

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24975 人正在系统学习中 相关资源:MinionProfitsTracker:随着市场价格波动,轻松识别最赚钱的奴才[在…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月1日
下一篇 2021年4月1日

相关推荐