/*-------------------------
*先申明下,本人是个菜鸟,刚开始接触驱动程序编写,交代下开发环境(主机系统redhat6.3,开发板ARM-s3c6410)
以watchdog (看门狗,俗称狗中断)为例,编写简单的中断(驱动)
-------------------------*/
#include <linux/init.h>
#include <linux/module.h>
#include <asm/io.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/irq.h>
#include <linux/interrupt.h> MODULE_LICENSE("GPL");
MODULE_AUTHOR("cheng"); typedef struct mydev{
unsigned long gpio_virt;
unsigned long wdt_virt;
unsigned long *gpmcon, *gpmdat;
unsigned long *wtcon, *wtdat, *wtcnt, *wtclrint;
void (*init_nydev)(struct mydev *this);
void (*exit_mydev)(struct mydev *this);
irqreturn_t (*do_irq)(int irq, struct mydev *this);
void (*led_on)(struct mydev *this);
void (*led_off)(struct mydev *this);
void (*wdt_on)(struct mydev *this);
void (*wdt_off)(struct mydev *this);
}MYDEV; void my_init_mydev(struct mydev *this);
void my_exit_mydev(struct mydev *this);
irqreturn_t my_do_irq(int irq, struct mydev *this);
void my_led_on(struct mydev *this);
void my_led_off(struct mydev *this);
void my_wdt_on(struct mydev *this);
void my_wdt_off(struct mydev *this); MYDEV my ;
static int test_init(void)
{
printk("hello,in my test_init\n");
my.init_mydev = my_init_mydev;
my.exit_mydev = my_exit_mydev;
my.init_mydev(&my); return 0;
} void test_exit()
{
my.exit_mydev(&my);
printk("this is test exit\n");
} module_init(test_init);
module_exit(test_exit); void my_init_mydev(struct mydev *this)
{
this->do_irq = my_do_irq;
this->led_on = my_led_on;
this->led_off = my_led_off;
this->wdt_on = my_wdt_on;
this->wdt_off = my_wdt_off;
int ret = request_irq(IRQ_WDT, this->do_irq, IRQF_SHARED,"hello", this);
if(ret < 0){
printk("request_irq error\n");
return ;
}
this->gpio_virt = ioremap(0x7f008000, SZ_4K);
this->wdt_virt = ioremap(0x7e004000, SZ_4K);
this->gpmcon = this->gpio_virt + 0x820;
this->gpmdat = this->gpio_virt + 0x824;
this->wtcon = this->wdt_virt + 0x00;
this->wtdat = this->wdt_virt + 0x04;
this->wtcnt = this->wdt_virt + 0x08;
this->wtclrint = this->wdt_virt + 0x0c;
this->wdt_on(this);
} void my_exit_mydev(struct mydev *this)
{
this->my_wtd_off(this);
iounmap(this->wdt_virt);
iounmap(this->gpio_virt);
free_irq(IRQ_WDT,this);
} irqreturn_t my_do_irq(int irq, struct mydev *this)
{
if(irq == IRQ_WDT){
*this->wtclrint = 0;
printk("wang wang wang\n");
static int flag = 1;
if(flag)
this->led_on(this);
else
this->led_off(this);
flag ^= 1;
}
return IRQ_HANDLED;
} void my_led_on(struct mydev *this)
{
*this->gpmcon = 1;
*this->gpmdat = 0;
} void my_led_off(struct mydev *this)
{
*this->gpmcon = 1;
*this->gpmdat = 1;
} void my_wdt_on(struct mydev *this)
{
*this->wtcon = (1 << 2) | (1 << 3) | (1 << 5) | (31 << 8);
*this->wtdat = 0x4000;
*this->wtcnt = 0x8000;
} void my_wdt_off(struct mydev *this)
{
*this->wtcon = 0;
}

/*
    下面是makefile内容:
*/

all:
make -C linux-2.6.28_smdk6410 M=`pwd` modules
clean:
make -C /linux-2.6.28_smdk6410 M=`pwd` clean
rm -rf modules.order
obj-m += test.o

面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)的更多相关文章

  1. 【嵌入式】安装Linux系统到开发板

    一.开发板基本介绍 Flash --相当于硬盘 RAM -- 内存 Micro USB或232串口 连电脑 USB 接口连摄像头 启动方式 选择开关 :SD卡启动或NAND FLASH 启动 USB转 ...

  2. 014安装Linux系统到开发板

    SD卡----->开发板 1.安装准备: 硬件连接 USB下载线,一端连到开发板,另一端连到PC机: 串口线连好: 电源线连好: 设置开发板从SD卡启动: 2.打开开发板进入选单界面: 进入选单 ...

  3. part1:15-安装Linux系统到开发板

    1.Qtopia简介 Qtopia是Trolltech公司为采用嵌入式Linux操作系统的消费电子设备而开发的综合应用平台,Qtopia包含完整的应用层.灵活的界面用户.窗口操作系统.应用程序启动程序 ...

  4. 7、linux系统2440开发板域名解析问题

    如果在linux系统中ping某一台电脑的ip地址可以ping 通: ~ >: ping 192.168.1.3PING 192.168.1.3 (192.168.1.3): 56 data b ...

  5. 嵌入式linux系统应用开发

    关于嵌入式系统   平时大家说的嵌入式其实范围比较广的,是一种软硬件可裁剪,以应用为中心开发的专用系统,硬件平台可以是单片机,或者以ARM系列的处理器.单片机一般直接裸奔程序,不过现在有了好多基于单片 ...

  6. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  7. linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,日本再战!)

    linux 3.4.103 内核移植到 S3C6410 开发板 这个星期差点儿就搭在这里面了,一開始感觉非常不值得,移植这样的浪费时间的事情.想立刻搞定,然后安安静静看书 & coding. ...

  8. 搭建测试环境——针对S3C6410开发板

    (一)前言 目前市面上的开发板型号和种类很多,但目前最流行的是基于三星S3C6410 ARM11架构的开发板.国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板,本博 ...

  9. 搭建S3C6410开发板的测试环境

      因为ARM架构的开发板可基于X86架构的PC在CPU指令以及二进制上都有所不同,而且如果linux驱动需要访问硬件,这些硬件很难在PC上模拟,所以就需要我们在带有这些硬件的开发板上进行调试和测试. ...

随机推荐

  1. ES6新增语法(四)——面向对象

    ES6中json的2个变化 简写:名字和值相同时,json可以可以简写 let a=12,b=5; let json = { a, b } console.log(json) // { a:12 , ...

  2. 分别在Update和FixedUpdate使用GetKeyDown

    测试目的 探究分别在Update和FixedUpdate使用GetKeyDown执行次数,会不同的 测试开始 在Update测试 我们先在Update测试,很正常是一帧重置一下状态,以防止点击一下执行 ...

  3. sync/fsync/fdatasync的简单比较

    此文主要转载自 http://blog.csdn.net/zbszhangbosen/article/details/7956558 官网上有关于MySQL的flush method的设置参数说明,但 ...

  4. BZOJ2457 双端队列 题解

    本题直接求解十分困难,因为在不知道整个序列的数字规律时当前所作决策都无法保证最优性. 考虑正难则反,题目转化为将一个非降序列分成尽量少的几段,让每段对应原问题的双端队列. 先将原数组排序,由于原数组下 ...

  5. odoo14里自定义批量下载数据【excel】

    1.创建一个向导模型: from odoo import models, fields, api import base64 import xlwt from io import BytesIO cl ...

  6. GetOverlappedResult 函数

    BOOL GetOverlappedResult( HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferre ...

  7. jquery设置下拉框selected不起作用

    在js中设置下拉框被选中: 最初写法: //移出selected $("#selected option").removeAttr("selected"); / ...

  8. Apollo mqtt 服务器搭建

    html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...

  9. ASPX页面传参中文乱码处理

    前端 function() { var msg='这是一段中文参数'; window.location.href="New.aspx?name="+escape(msg); } 后 ...

  10. shell中cmd1 && cmd2 || cmd3的含义

    在某些情况下,很多指令我想要一次输入去执行,而不想要分次去执行时,就要用到 && || 了.cmd 1 && cmd21,若cmd1执行完毕之后且正确执行($?=0), ...