在以前的文章中,有一篇

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

在那篇文章中,具体可以参考。那时候我使用了简单的字符设备驱动框架,最终的ID号通过read方法可将ID读取出来,但是,这样做就太麻烦啦,有没有更简单的方法呢?其实有,这种方法称作IO地址的映射,而今天我们要说的是IO地址的动态映射方法,静态映射就太简单了,直接调用相应的接口,配置相应的寄存器,设置状态就可以实现。接下来看看驱动代码:
#if 0
. io地址:
. 静态映射:
	//这个头文件与平台相关,不同平台对应不同的gpio.h,也就是有不同的配置信息
	arch/arm/mach-exynos/include/mach/gpio.h
	gpio ==> S3C64XX_GPx(n)
			 EXYNOS4X12_GPM0()
			 EXYNOS4_GPD0()

	int gpio_request(gpio, "name");		申请;
	void gpio_free(gpio);				撤销;

	int gpio_direction_output(gpio, dat);	配置为输出, 输出1/0;
	int gpio_direction_input(gpio);			配置为输入, 输入1/0;

	int s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(con));	配置为con;

	void gpio_set_value(gpio, dat);			输出1/0;
	int gpio_get_value(gpio);				输入1/0;

	irqnum = gpio_to_irq(gpio);			gpio <==> irqnum

	MACH_TYPE_TINY4412

	/* Initial IO mappings */

	static struct map_desc exynos_iodesc[] __initdata = {
		{
			.virtual    = (unsigned long)S5P_VA_CHIPID,
			.pfn        = __phys_to_pfn(EXYNOS_PA_CHIPID),
			.length     = SZ_4K,
			.type       = MT_DEVICE,
		},
	};

. 动态映射:
	virt = ioremap(phys, size);		//vmalloc_area
	iounmap(virt);
	//将虚拟地址转化为32位整型数
	ioread32(virt);
	iowrite32(val, virt);
	//将虚拟地址转化为16位整型数
	ioread16();
	iowrite16();
	//将虚拟地址转化为8位整型数
	ioread8();
	iowrite8();
#endif 

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/atomic.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/kthread.h>
#include <linux/slab.h>
//和IO相关的头文件
#include <linux/io.h>

//板子ID的物理地址  0x10000000 -----> 通过4412的手册查询到
#define CHIP_ID		0x10000000

int test_init(void)
{
	int ret;
	unsigned int *virt = NULL;
	printk("test init\n");
	//将CHIP_ID的物理地址映射成虚拟地址,分配4个字节的大小给它
	virt = ioremap(CHIP_ID, 4);
	//如果映射完成之后,virt指针为空,返回错误码
	if(IS_ERR_OR_NULL(virt))
	{
		ret = -EIO;
		goto ERROR_map;
	}
	//打印虚拟地址
	printk("virt = %p\n", virt);
	//打印物理地址
	printk("CHIP_ID = %x\n", CHIP_ID);
	//将虚拟地址转化为32位整型数
	printk("*virt = %x\n", ioread32(virt));
	//解除地址映射
	iounmap(virt);
	return 0;

ERROR_map:
	return ret;
}

void test_exit(void)
{
	printk("test exit\n");
}

module_init(test_init);
module_exit(test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("yangyx");
MODULE_VERSION("1.1");

使用IO映射的方式获取tiny4412板子上的ID号的更多相关文章

  1. 织梦dedecms获取当前内容页栏目id号的方法

    一,可在内容模板中直接这样写{dede:field.typeid/} 可显示本栏目的id 二,也可这样写 {dede:type}[field:ID /]{/dede:type}  . 三, 如果是在{ ...

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

    每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我 ...

  3. 如何获取板子上独有的ID号EXYNOS4412/Imx6ul【转】

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

  4. springboot整合mybatis(映射文件方式和注解方式)

    springboot作为一个微服务框架,给我们开发人员提供极大的便利,秉着约定大于配置的原则,通过starter包的形式为我们做了许多默认的配置,在进行数据持久化到关系型数据库时,我们一般都会首选sp ...

  5. 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法

    spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...

  6. linux驱动之中断方式获取键值

    linux驱动之中断方式获取键值 ----------------------------------------------------------------------------------- ...

  7. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

  8. java 利用HttpURLConnection方式获取restful格式的服务数据

    /** * @Author: * @Description:利用HttpURLConnection方式获取restful格式的服务数据 * @Date: */ private static List& ...

  9. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

随机推荐

  1. 在Gazebo中使用DEM構建起伏地形環境

    所需資料下載地址: 1. https://bitbucket.org/osrf/gazebo_tutorials/raw/default/dem/files/ 数字高程模型(致謝谷歌翻譯)概述数字高程 ...

  2. Makefile自动生成

    automake/autoconf入门作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ...

  3. PyCharm 开发Django ,错误汇总

    近期略微接触了一下Django.在学习的过程中可谓是坎坎坷坷,遇到了很多的问题. 下面就来谈一谈我对Django的一点点的见解. Django项目的创建 使用PyCharm来开发Django项目是非常 ...

  4. android打包引用第三方jar出现的错误

    今天终于完成了近一个月的App开发工作,对程序进行混淆导出签名apk包时,却出现了如下的错误: Proguard returned with error code 1. See console Not ...

  5. android开发之broadcast学习笔记

    android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...

  6. Nginx创建密码保护目录

    nginx 的根目录 为:/home/undoner/nginx-wwwnginx 访问地址 为:http://127.0.0.1本文实现对nginx根目录文件访问的权限控制 (1)nginx指定密码 ...

  7. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  8. 怎么在Eclipse中添加VI插件

    下载地址 Vi插件下载位置 怎么安装? 将下载下来的zip文件进行解压,然后把对于的目录下的文件分别复制到eclipse目录下的plugins 和features目录下: 注册 在eclipse根目录 ...

  9. Uva - 12504 - Updating a Dictionary

    全是字符串相关处理,截取长度等相关操作的练习 AC代码: #include <iostream> #include <cstdio> #include <cstdlib& ...

  10. CUDA程序的调试总结【不定时更新】

    1 )CUDA的程序,经常犯,但是很难发现的一个错误就是同步问题. 描述下实例 for (k = 0; k < N; k+=BS) { sda[tx] = gda[tx+index]; __sy ...