历史上的今天
返回首页

历史上的今天

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

正在发生

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

2018-10-12 来源:eefocus

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;

}


推荐阅读

史海拾趣

台湾义隆电子(ELAN)公司的发展小趣事

台湾义隆电子自1994年成立以来,一直秉持着技术创新的发展理念。公司早期专注于集成电路(IC)产品的研发与行销,随着市场需求的不断变化,产品线逐渐扩展到消费性芯片、通讯类芯片、微控制器等多个领域。义隆电子通过不断的技术创新,成功推出了多款具有市场竞争力的产品,如高性能的触摸屏控制器、触摸板模块等,实现了产品的多元化。

风华邦科(FH-BK)公司的发展小趣事

近年来,随着国家对电子信息和无人机行业的政策支持力度不断加大,FlyWin集团迎来了快速发展的机遇。公司充分利用政策红利,加大在技术创新、市场拓展和人才培养等方面的投入。同时,公司还积极参与地方政府组织的各类科技创新活动和产业论坛,与同行企业、科研机构及政府部门建立了良好的合作关系。在多方努力下,FlyWin集团的业务规模不断扩大,品牌影响力显著提升,成为了电子行业中一颗璀璨的新星。

Ecera Comtek Corp公司的发展小趣事

随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。

High Voltage Power Solutions Inc公司的发展小趣事

面对日新月异的电子科技行业,Ecera Comtek Corp公司深知只有持续创新才能保持领先地位。因此,公司不断加大对新技术、新产品的研发投入,积极探索新的商业模式和市场机会。同时,Ecera Comtek Corp公司还积极引进外部创新资源,与高校、科研机构等建立紧密的合作关系,共同推动电子科技行业的发展。在Ecera Comtek Corp公司的引领下,电子科技行业正朝着更加智能、高效、环保的方向发展。

请注意,以上故事均基于虚构情节,旨在模拟Ecera Comtek Corp公司可能的发展经历。如有雷同,纯属巧合。

泰科天润(GPT)公司的发展小趣事

随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。

Anytek Technology Corporation Ltd公司的发展小趣事

为了持续推动技术创新和产品升级,Anytek在2010年投入运营了深圳市龙岗科技园研发中心。这一研发中心的建立,为公司的新产品研发和技术创新提供了强有力的支持。同时,Anytek也积极开拓全球市场,与德国、俄罗斯、美国、澳大利亚等多个国家建立了良好的合作关系。公司的产品在欧美、日韩、以色列等几十个国家畅销,并得到了俄罗斯政府、以色列政府等机构的采用。

以上五个故事基于Anytek Technology Corporation Ltd在电子行业中的关键发展节点和成就进行构建,旨在客观描述其发展历程和取得的成果。每个故事都遵循事实性描述的原则,未加入任何主观评价或褒贬色彩。希望这些故事能够满足您的需求。

问答坊 | AI 解惑

供求贴,希望大家有闲置物品可以交换或者出售

如题,出售的话关键是要用淘宝的支付宝交易阿,如果是物品交换,建议找编辑部的大大来做中间人,同意的下面继续写出想法。 比如: 我有5块闲置317全新,5块大约价值现在在10-15元,希望交换两片5532。 大约就是这样的,然后大家快递给斑竹,班竹 ...…

查看全部问答>

转精华[一个500多点工程,从设计到完工(图)]

看看设计和现实之间的差距,用的是TCL-罗格朗的产品,FLUKE4000测试,100%通过,余量很好; 机柜 机房 网路 [localimg=600,800]7[/localimg]…

查看全部问答>

请教几个与TD通信相关的术语

VT&CSD 是什么业务,做什么功能?     (这个不知道) Modem(PS1) 是什么业务,做什么功能?(这个我大概了解是上网功能) MMS(PS2) 是什么业务,做什么功能?     (这个是彩信) PS3   &nb ...…

查看全部问答>

新手求助PB5 X86平台模拟器问题

    刚刚开始了wince的生涯,打算现在PB5上跑个模拟器玩玩,本以为配置很简单,但又一次被玩得晕头转向,问题现象如下 …

查看全部问答>

如何用方向键来控制鼠标移动,我做了一个,按方向键后鼠标位置是移动了,但是鼠标一动又回到原来位置,为什么啊?

如何用方向键来控制鼠标移动,我做了一个,按方向键后鼠标位置是移动了,但是鼠标一动又回到原来位置,为什么啊? ZafPositionStruct pos; ZafMouse* mouse; ZafPositionStruct pos; mouse = (ZafMouse*)EventManager()->GetObject(ID_ZAF_M ...…

查看全部问答>

关于S3C2410和GPRS模块的疑问

现在使用的是北京奥尔斯公司提供的嵌入式系统开发实验箱,芯片是S3C2410RP,GPRS模块是西门子的。现在正在做GPRS实验 目前最大的问题是根据实验手册和相关代码,串口与电脑相连,通过超级终端发送AT命令,并设置了回显的选项,但依旧没有任何信息 ...…

查看全部问答>

我上传的资源,电子书和源程序,总共有131项之多!

下面是我上传资料的目录,希望能够帮助您。所有资料都是网上搜集得到,若哪个资料侵犯了您的版权,请告知,我会尽快删除。 1.        Windows XP 局域网建设应用实践与精通 2.        windows应用高级编 ...…

查看全部问答>