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

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

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

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

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

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

1、看手册

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

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

2、编写驱动程序

#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、编写测试程序

#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、编译


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

7、运行结果:

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

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

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

  1. 基于arm-linux的防火墙设计,基于ARM9的Linux驱动开发及防火墙设计

    摘要: 随着通信与信息科技.数字与IC设计技术在我们的日常生活及工作中的的迅猛普及,嵌入式系统设计正在成为现代信息技术中的主流技术.本文主要阐述了嵌入式Linux的概念.基础.网络结构.网络设备驱动程 ...

  2. arm裸机与嵌入式linux驱动开发,如何编写基于ARM的裸机程序和基于Linux的驱动程序?...

    在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序. ARM架构:Cortex-A9Linux内核:3.14 在讲述ADC之前, ...

  3. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  4. 【正点原子MP157连载】第二十三章 Linux设备树-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  5. 基于V4L2的视频驱动开发

    基于V4L2的视频驱动开发 编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等. ●Camera解码 ...

  6. 最全Linux驱动开发全流程详细解析(持续更新)

    Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...

  7. 【正点原子Linux连载】第四十三章 Linux设备树 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. Linux 驱动开发 三十五:Linux 内核时钟管理

    参考: linux时间管理,时钟中断,系统节拍_u010936265的博客-CSDN博客_系统节拍时钟中断 Linux内核时钟系统和定时器实现_anonymalias的专栏-CSDN博客_linux内 ...

最新文章

  1. windows用 tree命令查看目录文件夹结构
  2. 安全日志的自动备份方法
  3. 5G 与边缘计算的发展现状(2021 年 6 月)
  4. 河北大学计算机二级报名时间,河北大学关于2018年下半年学位授予工作安排的通知...
  5. Angular之Error: ExpressionChangedAfterItHasBeenChecked
  6. Xcode 8 GM 编译缺失 /Users/usr/lib/libresolv.9.dylib
  7. 通过Spring Social发推StackExchange问​​题
  8. 源码解析Spring Boot2默认数据库连接池HikariCP(高性能原因分析)
  9. Tomcat服务器响应特别慢(服务器假死)的解决办法
  10. 11个优秀PHP开发框架-专门为开发人员准备
  11. Gossip in Cassandra
  12. 谷歌gmail注册入口_如何更改,恢复,重设Gmail,Google云端硬盘,Android,Chrome的Google帐户密码?...
  13. Tomcat、Servlet、JSP、EL和JDK版本对照以及各版本Tomcat下载
  14. “挖矿2.0”:资本方不是只能割区块链的韭菜
  15. 计算机如何默认一种打字法,如何设置输入法,教您如何设置电脑的默认输入法...
  16. Tecplot操作记录
  17. 数学建模论文写作学习——数模论文概述
  18. Python:模拟邮箱登陆
  19. 爱码哥移动开发平台的4大开发环境
  20. DRV8870/A4950/AT8870(3.6A单通道刷式直流电机驱动IC)

热门文章

  1. python禁用键盘鼠标_在Python中禁用或锁定鼠标和键盘?
  2. python运维脚本部署jdk_Jenkins 为Jenkins添加Windows Slave远程执行python项目脚本
  3. eclipse集成weblogic开发环境的搭建
  4. Java中将ResultSet结果集转换为List
  5. 洛谷P1962 斐波那契数列
  6. CGMP, IGMP Snooping and RGMP
  7. 《分布式系统:概念与设计》一2.3.1 体系结构元素
  8. web前端基础知识-(六)jQuery-补
  9. JAVA中的观察者模式observer
  10. Android 版权介绍