历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210按键分层分离(总线-驱动-设备模型)

发布者:二进制游侠 来源: eefocus关键字:Tiny210  按键分层分离 手机看文章 扫描二维码
随时随地手机看文章

led_dev.c驱动源码:

#include "linux/module.h"

#include "linux/version.h"

#include "linux/init.h"

#include "linux/kernel.h"

#include "linux/types.h"

#include "linux/interrupt.h"

#include "linux/list.h"

#include "linux/timer.h"

#include "linux/init.h"

#include "linux/serial_core.h"

#include "linux/platform_device.h"

// 分配/设置/注册一个platform_device 

static struct resource led_resource[] = {

    [0] = {

        .start = 0xE0200280,

        .end   = 0xE0200280 + 8 - 1,

        .flags = IORESOURCE_MEM,

    },

    [1] = {

        .start = 0,

        .end   = 0,

        .flags = IORESOURCE_IRQ,

    }

};

static void led_release(struct device * dev)

{

}

static struct platform_device led_dev = {

    .name                  = "myled",

    .id                        = -1,

    .num_resources  = ARRAY_SIZE(led_resource),

    .resource             = led_resource,

    .dev = { 

        .release            = led_release, 

    },

};

static int led_dev_init(void)

{

    platform_device_register(&led_dev);

    return 0;

}

static void led_dev_exit(void)

{

    platform_device_unregister(&led_dev);

}

module_init(led_dev_init);

module_exit(led_dev_exit);

MODULE_LICENSE("GPL");

===================================================================

led_drv.c驱动源码:

// 分配/设置/注册一个platform_driver 

#include "linux/module.h"

#include "linux/version.h"

#include "linux/init.h"

#include "linux/fs.h"

#include "linux/interrupt.h"

#include "linux/irq.h"

#include "linux/sched.h"

#include "linux/pm.h"

#include "linux/sysctl.h"

#include "linux/proc_fs.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

#include "linux/input.h"

#include "linux/irq.h"

#include "asm/uaccess.h"

#include "asm/io.h"

static int major;

static struct class *cls;

static volatile unsigned long *gpio_con;

static volatile unsigned long *gpio_dat;

static int pin;

static int led_open(struct inode *inode, struct file *file)

{

    //printk("first_drv_open\n");

    // 配置为输出 

    *gpio_con &= ~(0xf<<(pin*4));

    *gpio_con |= (0x1<<(pin*4));

    return 0;    

}

static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

{

    int val;

    //printk("first_drv_write\n");

    copy_from_user(&val, buf, count); //    copy_to_user();

    if (val == 1)

    {

        // 点灯

        *gpio_dat &= ~(1<

    }

    else

    {

        // 灭灯

        *gpio_dat |= (1<

    }

    

    return 0;

}

static struct file_operations led_fops = {

    .owner  =   THIS_MODULE,    // 这是一个宏,推向编译模块时自动创建的__this_module变量 

    .open   =   led_open,     

    .write  =   led_write,       

};

static int led_probe(struct platform_device *pdev)

{

    struct resource        *res;

    // 根据platform_device的资源进行ioremap 

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

    gpio_con = ioremap(res->start, res->end - res->start + 1);

    gpio_dat = gpio_con + 1;

    res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

    pin = res->start;

    // 注册字符设备驱动程序 

    printk("led_probe, found led\n");

    major = register_chrdev(0, "myled", &led_fops);

    cls = class_create(THIS_MODULE, "myled");

    device_create(cls, NULL, MKDEV(major, 0), NULL, "led"); // /dev/led 

    

    return 0;

}

static int led_remove(struct platform_device *pdev)

{

    // 卸载字符设备驱动程序 

    // iounmap 

    printk("led_remove, remove led\n");

    device_destroy(cls, MKDEV(major, 0));

    class_destroy(cls);

    unregister_chrdev(major, "myled");

    iounmap(gpio_con);

    

    return 0;

}

struct platform_driver led_drv = {

    .probe    = led_probe,

    .remove  = led_remove,

    .driver     = {

        .name = "myled",

    }

};

static int led_drv_init(void)

{

    platform_driver_register(&led_drv);

    return 0;

}

static void led_drv_exit(void)

{

    platform_driver_unregister(&led_drv);

}

module_init(led_drv_init);

module_exit(led_drv_exit);

MODULE_LICENSE("GPL");

====================================================================

led_test.c测试程序:

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "stdio.h"

// led_test on

// led_test off

int main(int argc, char **argv)

{

    int fd;

    int val = 1;

    

    fd = open("/dev/led", O_RDWR);

    if (fd < 0)

    {

        printf("can't open!\n");

    }

    if (argc != 2)

    {

        printf("Usage :\n");

        printf("%s 《on|off》\n", argv[0]); //实际为"<"

        return 0;

    }

    if (strcmp(argv[1], "on") == 0)

    {

        val  = 1;

    }

    else

    {

        val = 0;

    }

    write(fd, &val, 4);

    return 0;

}


关键字:Tiny210  按键分层分离 引用地址:Tiny210按键分层分离(总线-驱动-设备模型)

上一篇:Tiny210驱动之LCD驱动程序
下一篇:Tiny210按键输入子系统

推荐阅读

start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU 0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间 ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) 2、关看门狗 ,往WTCON(0x7E004000)写0 ldr r0...
据华尔街日报报道,中国和美国在近日举行的贸易磋商中,在原则上已经就一项贸易协议的第一阶段达成了一致意见。 报道指出,中国将会增加购买美国的农产品,而相应的美国表示将会推迟增加关税。第一阶段协议的达成将有助于缓解两国之间的紧张关系。 特朗普表示,第一阶段的协议将会在未来三到五周内敲定。 ...
环境:主机:WIN8开发环境:MDK4.72ucgui版本:3.90ucos版本:ucos-iimcu: stm32f103VE说明:本示例中task1通过邮箱发送数据给task2效果图:源码:#define TASK_STK_SIZE 512 /********************************************************************** 静态函数**********************************************************************/ static...
近日,在世界经济论坛(WEF)发布新一期全球制造业领域“灯塔工厂”名单中,三一重工桩机工厂入选。世界最大的混凝土机械制造商、亚洲最大的智能制造车间、中国最聪明的工厂……三一重工拥有许多令人艳羡的“头衔”。“世界第一高楼”阿联酋迪拜塔、“中国第一高楼”上海中心大厦、“中国第一高塔”广州小蛮腰等超高层建筑,皆有三一重工的身影。随着新一...

史海拾趣

问答坊 | AI 解惑

我的电脑不能单台机多用户上网~~急!!!!!!!!!!(DR。COM)

我的电脑不能单台机多用户上网~~急!!!!!!!!!!我用的是学校DR。COM拨号上网的。。。请问怎么实现一台机多用户上网!!谢谢~~用WINDOS的操作系统噢~~~…

查看全部问答∨

PWM 控制的蜂鸣器 驱动问题

wince 上 谁开发过PWM 控制的蜂鸣器驱动?给点思路。 …

查看全部问答∨

WinCE上,lib 变为 dll.

D:\\WINCE600\\PUBLIC\\DIRECTX\\SDK\\SAMPLES\\DSHOW\\FILTERS\\BALL, build -c 编译出来是ball.lib. 想要编译出来是ball.dll, 其它程序好调用. 现改D:\\WINCE600\\PUBLIC\\DIRECTX\\SDK\\SAMPLES\\DSHOW\\FILTERS\\BALL\\sources 文件, &n ...…

查看全部问答∨

请教:松下A4伺服脉冲计算

根据所明书公式: 电机每转一圈所需脉冲数=编码器分辨率*Pr4B/(Pr48(或Pr49)*2^Pr4A)。 但似乎Pr4A=0,Pr4B=10000,设为其它值电机每转一圈所需脉冲数没变化。 请伺服高手赐教…

查看全部问答∨

CE6.0加驱动后,启动时自动软件复位

写了两天代码,以为今天可以调试了……可刚加载到NK中就出现了下面的错误: 1、Eboot打印输出: [UFNPDD] OTG Cable Attached [UFNPDD] RESET Again [USBH] HcdPdd_Init() [USBH] ++InitializeOHCI() [USBH] --InitializeOHCI() : Success ...…

查看全部问答∨

如何把变量定义在信息存储器FLASH里?

我想在信息存储器里定义一些变量但是没成功 #pragma memory=constseg(INFO) int b=0x1234; char c=0x12; #pragma memory=default 变量的地址还是在内存里,不知道为什么?高手指教!…

查看全部问答∨

有关运放的问题

我用LM358运放模拟一个最简单的负反馈跟随电路,仿真的时候是完全没有问题的,可为什么一实践就出问题,始终不满足虚短要求,他的2脚始终不为低,当VCC=5V时,2叫电位为2.8V,当VCC=0.8V时,2脚点位为0.4V,运放采用单电源12V供电。求各位指教,这 ...…

查看全部问答∨

2P2Z使用

请问,哪位有用过TI 的2p2z补偿 模块。 《 如何降低 UCD30xx系列数字电源控制器 DPWM抖动 》  这篇文章,里面提到的 2P2Z参数计算过程如下:   写出补偿环路的 s域变换,(这个 在补偿环路的资料里都有) 再将s域变换 转到 z ...…

查看全部问答∨

基于51单片机的洗衣机控制系统

利用独立键盘模拟洗衣机操作按钮,K1为设置洗衣操作时间,K2为电机启动按钮,当K2按下后,电机正转30秒后,反转30秒后,反复执行此操作到洗衣操作时间结束。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved