关于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.不断地实践。

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24975 人正在系统学习中 相关资源:MinionProfitsTracker:随着市场价格波动,轻松识别最赚钱的奴才[在…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!