热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

虚拟地址linux驱动,2410并行接口驱动,虚拟地址和实际地址映射问题。

2410并行接口驱动,虚拟地址和实际地址映射问题。[复制链接]使用S3C2410的DATA0~DATA15,扩展2个并行接口,原理图如下所

2410并行接口驱动,虚拟地址和实际地址映射问题。

[复制链接]

使用S3C2410的DATA0~DATA15,扩展2个并行接口,原理图如下所示。

通过一个CPLD扩展I/O驱动修改成驱动程序,编译没有出错,但是在板子上insmod时出现段错误。

怀疑是使用的物理地址和虚拟地址不对。

#define pEXTERNAL_IO_Addr 0x080000c0

#define EXTERNAL_BaseAddr_IO (*(volatile unsigned char*)(0xd02000c0))

加载模块时出错信息:

[root@(none) tmp]# insmod DIGIO2.ko

Using DIGIO2.ko

Unable to handle kernel paging request at virtual address 56000000

pgd = c2604000

[56000000] *pgd=00000000

Internal error: Oops: 5 [#1]

Modules linked in: DIGIO ov511 usbvideo usb_storage sd_mod

CPU: 0

PC is at digio_init+0x50/0xc0 [DIGIO]

LR is at 0x56000004

pc : []    lr : [<56000004>]    Not tainted

sp : c2e55f6c  ip : 56000000  fp : c2e55f84

r10: 00000000  r9 : c2e54000  r8 : c002c5c4

r7 : 00000000  r6 : 56000014  r5 : 56000010  r4 : 00000000

r3 : c0270284  r2 : 0000efff  r1 : 000007fe  r0 : bf03010c

Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  Segment user

Control: C000717F  Table: 32604000  DAC: 00000015

Process insmod (pid: 337, stack limit &#61; 0xc2e54190)

Stack: (0xc2e55f6c to 0xc2e56000)

5f60:                            c026f44c bf030520 c026f434 c2e55fa4 c2e55f88

5f80: c0055fbc bf032010 00000004 00000000 00000000 00000080 00000000 c2e55fa8

5fa0: c002c440 c0055e20 00000000 00000000 00900080 40015000 00000b79 001cb028

5fc0: 00000004 00000000 00000000 befffd74 001cb018 001cb008 00000000 00000000

5fe0: beffd8c4 beffd8b8 000444e0 40199ac0 60000010 00900080 e586000c e596201c

Backtrace:

[] (digio_init&#43;0x0/0xc0 [DIGIO]) from [] (sys_init_module&#43;0)

r6 &#61; C026F434  r5 &#61; BF030520  r4 &#61; C026F44C

[] (sys_init_module&#43;0x0/0x314) from [] (ret_fast_syscall&#43;0x)

r7 &#61; 00000080  r6 &#61; 00000000  r5 &#61; 00000000  r4 &#61; 00000004

Code: aa000002 eb403843 e1a00004 e91ba870 (e59c3000)

Segmentation fault

a26d678767e8b431ecd7a25f1936bdc5.gif

并行接口原理图.jpg (164.89 KB, 下载次数: 0)

并行接口原理图

2012-11-29 14:57 上传

并行接口原理图

附上驱动程序代码&#xff1a;

#ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include//包含可装载模块需要的大量符号和函数的定义

#include#include//定义了LINUX内核的版本&#xff0c;用于版本检查

#include#include//指定初始化和清除函数

#include//#include

//

//#include//LINUX内核编译时的配置文件&#xff0c;文件里面指向另一个由make menuconfig自动生成的文件autoconfig.h

#include#include//最重要的头文件之一。该文件包含驱动程序使用的大部分内核API的定义&#xff0c;包含睡眠函数以及各种变量声明。

#include#include#include#include//#include#include#include//

#define DEVICE_NAME "digio" //设备名

#define DIGIO_MAJOR 232   //主设备号

//unsigned short buffer,dio_value;

#define pEXTERNAL_IO_Addr 0x080000c0

#define EXTERNAL_BaseAddr_IO (*(volatile unsigned char*)(0xd02000c0))

/*

static void dig_io_read()

{

(void *)(digital_in)&#61;ioremap(0x0800b800,0x2);   //映射74HC574,16位

buffer&#61;*(volatile unsigned short *)(digital_in); //读数字输入

copy_to_user(buffer,&dio_value,sizeof(dio_value));//数据送入用户空间

}

static void dig_io_write()

{

(void *)(digital_out)&#61;ioremap(0x10000000,0x2);   //映射74HC574,16位

copy_form_user(&dio_value,buffer,sizeof(dio_value));//数据送入内核空间

*(volatile unsigned short *)&#61;buffer;        //写数字输出

}

*/

static ssize_t dig_io_read(struct file *filp,char *buf,size_t count,loff_t *f_pos) //读函数

{

unsigned char val;

val&#61;inb(EXTERNAL_BaseAddr_IO); //读取数据

copy_to_user(buf,&val,1); //数据送入用户空间

return 1;

}

static ssize_t dig_io_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos)

{

unsigned char val;

copy_from_user(&val,buf,1); //数据送入内核空间

outb(val,EXTERNAL_BaseAddr_IO); //写数据

return 1;

}

static struct file_operations digio_fops&#61;{

owner:THIS_MODULE,

write:dig_io_write,

read:dig_io_read,

};

//static devfs_handle_t devfs_handle;

/*

static int digio_ioctl(struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)

{

switch(cmd)

{

case 0:dig_io_read();

case 1:dig_io_write();

default:

return -EINVAL;

}

}

static struct file_operations digio_fops&#61;{

owner:THIS_MODULE,

ioctl:digio_ioctl,

};

*/

static int __init digio_init(void) //设备驱动初始化函数

{

int ret;

int i;

ret&#61;register_chrdev(DIGIO_MAJOR,DEVICE_NAME,&digio_fops);

if(ret<0)

{

printk(DEVICE_NAME"can&#39;t regsiter major number");

return ret;

}

// devfs_handle&#61;devfs_register(NULL,DEVICE_NAME,DEVFS_FL_DEFAULT,DIGIO_MAJOR,S_IFCHR|S_IRUSR|S_IWUSR,&digio_fops,NULL);

// EXTERNAL_BaseAddr_IO&#61;ioremap(pEXTERNAL_IO_Addr,1);

rGPACON&#61;rGPACON&0x7effff;

rGPADAT&#61;rGPADAT&0xefff;

rGPBCON&#61;rGPBCON&0x3ffffc|0x000001;

rGPBDAT&#61;rGPBDAT&0x7fe;

printk(DEVICE_NAME"initialized\n");

return 0;

}

static void __exit digio_exit(void) //模块退出函数

{

// iounmap(EXTERNAL_BaseAddr_IO);

// devfs_unregister(devfs_handle);

unregister_chrdev(DIGIO_MAJOR,DEVICE_NAME);

}

module_init(digio_init);

module_exit(digio_exit);

MODULE_LICENSE("GPL");



推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
等待那个心中的人_212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有