基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号

简介: 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号

640.jpg

每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我在光盘里拿到的linux-3.5内核其实已经将ID相关的驱动开发好了,我们在内核启动的过程中就可以看到板子CPU的ID:

   看下图,我们看到CPU EXYNOS4412 (Id 0xe4412011)。这个就是我板子上CPU的ID号。其它跟我相同的板子,虽然CPU也是相同的,但是板子的ID号会不一样,不信可以试试0.gif

0.jpg

那么,现在我不加载linux-3.5这个内核上的ID,我自己写一个驱动程序来将这个ID读出来,能否实现?

   验证结果:如果我写的驱动程序读出来的ID和linux内核3.5启动过程中的ID:0xe4412011相同的话,那么就证明我读对了。

   好,我们来看看具体如何来实现这个驱动程序。0.gif0.gif

   还是一样的,和以前的步骤相同,但是这里的话就不用看电路图了,因为ID号是CPU内部的,我们只需要去看手册配置寄存器就可以得到相应的ID号了。

    1、看手册

640.png

640.jpg640.png

从手册上看到,大概的意思就是,如果要读出CPU的ID号,那么就需要先把PRO_ID的物理地址映射为虚拟地址,然后再读PRO_ID即可得到CPU的ID号。

      接下来来看看驱动程序如何编写:

2、编写驱动程序

[cpp] view plain copy print?

#include <linux/init.h>  
#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/fs.h>  
#include <linux/io.h>  
#include <asm/uaccess.h>  
#include <asm/irq.h>  
#include <asm/io.h>  
#define DEV_NAME    "test-dev"  
//板子ID的物理地址   
#define PRO_ID      0x10000000  
//定义一个虚拟地址变量   
unsigned int  *virtul = NULL ;   
//open方法,不需要实现   
int id_open(struct inode *inode, struct file *filp)  
{  
    printk("id_open\n");  
    return 0;  
}  
//read方法,实现虚拟地址的返回   
ssize_t id_read(struct file *file , char __user *buf ,size_t size ,loff_t *offset)  
{  
    printk("id_read\n");  
    if(size < 4){  
        return -1 ;   
    }  
    //将虚拟地址转化为32位整型数   
    return ioread32(virtul);  
}  
struct file_operations fops = {  
    .owner = THIS_MODULE ,  
    .open = id_open,  
    .read = id_read,  
};  
int major ;  
int test_init(void)  
{  
    printk("id_init\n");  
    //注册设备   
    major = register_chrdev(major, DEV_NAME, &fops);  
    //虚拟地址映射   
    virtul = ioremap(PRO_ID , 4);   
    //判断是否为空或出现错误,如果出现返回-1   
    if(IS_ERR_OR_NULL(virtul))  
    {  
        return -1 ;  
    }  
    return 0;  
}  
void test_exit(void)  
{  
    printk("id_exit\n");  
    //注销设备   
    unregister_chrdev(major, DEV_NAME);  
    //取消映射   
    iounmap(virtul);  
}  
module_init(test_init);  
module_exit(test_exit);  
MODULE_LICENSE("GPL");  
MODULE_AUTHOR("Y.X.YANG");  
MODULE_VERSION("2016.1.16");  

3、编写测试程序

[cpp] view plain copy print?

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
int main(int argc, char **argv)  
{  
    int fd;  
    unsigned int id_val = 0 ;  
    char id_buf[4] = {0};  
    fd = open("/dev/test-dev",O_RDWR) ;  
    if(-1 == fd)  
    {  
        printf("open fair!\n");  
        return -1 ;  
    }  
    //获取ID的值   
    id_val = read(fd , id_buf , 4);  
    //以地址的形式打印   
    printf("id_val = %p\n",id_val);  
    return 0;  
}  

4、makefile(略)


5、编译

640.jpg

6、插入模块,显示模块,查看主设备号,创建设备节点(略)

7、运行结果:

640.jpg

果然,读出来的ID号正是内核启动时的ID:CPU EXYNOS4412 (Id 0xe4412011) .

     驱动验证成功!0.gif成功获取板子CPU_ID号!

目录
相关文章
|
18天前
|
编解码 Linux
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
XviD是开源的MPEG-4视频编解码器,曾与DivX一起用于早期MP4视频编码,但现在已被H.264取代。要集成XviD到Linux上的FFmpeg,首先下载源码,解压后配置并编译安装libxvid。接着,在FFmpeg源码目录中,重新配置FFmpeg以启用libxvid,然后编译并安装。成功后,通过`ffmpeg -version`检查是否启用libxvid。详细步骤包括下载、解压libxvid,使用`configure`和`make`命令安装,以及更新FFmpeg配置并安装。
36 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
|
24天前
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
36 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
25天前
|
编解码 Linux
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp
《FFmpeg开发实战》书中指导如何在Linux环境下为FFmpeg集成libwebp以支持WebP图片编解码。首先,从GitHub下载libwebp源码,解压后通过`libtoolize`,`autogen.sh`,`configure`,`make -j4`和`make install`步骤安装。接着,在FFmpeg源码目录中重新配置并添加`--enable-libwebp`选项,然后进行`make clean`,`make -j4`和`make install`以编译安装FFmpeg。最后,验证FFmpeg版本信息确认libwebp已启用。
40 1
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp
|
1月前
|
Linux 编解码 Python
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
AV1是一种高效免费的视频编码标准,由AOM联盟制定,相比H.265压缩率提升约27%。各大流媒体平台倾向使用AV1。本文介绍了如何在Linux环境下为FFmpeg集成AV1编解码库libaom、libdav1d和libsvtav1。涉及下载源码、配置、编译和安装步骤,包括设置环境变量以启用这三个库。
49 3
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
|
11天前
|
安全 Linux 数据安全/隐私保护
探索Linux命令newuidmap:用户ID映射的利器
`newuidmap`是Linux工具,用于在用户命名空间中设定UID映射,支持容器安全。它允许限定容器内进程的主机系统权限,确保数据安全和隔离。通过映射文件或命令行参数定义UID映射,提供灵活性和安全性。例如,为Docker容器设置映射,使进程能访问特定UID的数据文件。使用时需注意映射准确性、权限控制和避免映射过多UID。与其他工具如`newgidmap`配合使用以增强用户命名空间支持。
|
17天前
|
Linux 数据处理 数据库
深入解析Linux命令id:理解用户身份与权限
`id`命令在Linux中用于显示用户身份(UID, GID和附加组)。它查看系统用户数据库获取信息。参数如`-u`显示UID,`-g`显示GID,`-G`显示附加组,结合`-n`显示名称而非ID。用于确认命令执行者身份,确保权限正确。在脚本中使用时注意权限管理,遵循最小权限原则。
|
16天前
|
Linux
【GEC6818开发板】Linux驱动中printk无法在终端输出显示
【GEC6818开发板】Linux驱动中printk无法在终端输出显示
|
16天前
|
Linux 程序员 芯片
【Linux驱动】普通字符设备驱动程序框架
【Linux驱动】普通字符设备驱动程序框架
|
18天前
|
Linux Windows 虚拟化
【Linux环境搭建实战手册】:打造高效开发空间的秘籍
【Linux环境搭建实战手册】:打造高效开发空间的秘籍
|
1天前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅