每个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. 如何获取板子上独有的ID号EXYNOS4412/Imx6ul【转】

    本文转载自:http://blog.csdn.net/u010871058/article/details/75637175 每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含 ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

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

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

  4. 浅析基于ARM的Linux下的系统调用的实现

    在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...

  5. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

  6. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  7. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  8. 【转】linux驱动开发的经典书籍

    原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...

  9. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. FORM开发之键性弹性域开发

    1.创建表时带有键弹性域字段 SUMMARY_FLAG VARCHAR2(1) , /* 必须有此字段 */ ENABLED_FLAG VARCHAR2(1) , /* 必须有此字段 */ START ...

  2. IE下的deflate模式

    浏览器有一个非常有用的特性:自动解压. 在使用AJAX请求数据的时候,数据在服务器端压缩传输,在浏览器端自动解压,请求直接得到解压后的结果. 在Request Header中,一般会列出浏览器支持的压 ...

  3. (一三〇)UITextField的光标操作扩展

    简介 在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精 ...

  4. Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题

    以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257 IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后, ...

  5. 1.Android中解析json程序代码

    Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override protected void onCreate(Bundle savedI ...

  6. java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较

    一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ...

  7. SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在动作或RPG类游戏中我们有时需要天黑和天亮过度的效果来完成场 ...

  8. 可视化分析工具Cytoscape使用记录

    最近项目要使用到可视化分析工具Cytoscape,所以会花费很多的时间跟精力来整理Cytoscape软件使用和开发的相关资料,希望写下的文章能减少有兴趣的同行学习跟开发所走的弯路时间.同时也是因为百度 ...

  9. Java:将字符串中的数字转换成整型

    在C语言中,将字符串中的数字转换为整型的方法是是利用atoi这个函数.在Java中,我们可以利用parseInt方法来实现,具体代码如下: public class HelloWorld { publ ...

  10. Mybatis插件原理分析(一)

    我们首先介绍一下Mybatis插件相关的几个类,并对源码进行了简单的分析. Mybatis插件相关的接口或类有:Intercept.InterceptChain.Plugin和Invocation,这 ...