历史上的今天
返回首页

历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2018年10月11日 | OK6410分层分离(总线-驱动-设备模型)

2018-10-11 来源:eefocus

led_dev.c源码:

#include "linux/module.h"

#include "linux/moduleparam.h"

#include "linux/ioport.h"

#include "linux/init.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

// 1. 分配一个platform_device 

// 2. 设置 

static struct resource led_resoures[] = {

    [0] = {

        .start  = 0x7F008820,  // GPMCON 

        .end    = 0x7F008827,

        .flags  = IORESOURCE_MEM,

    },

    [1] = {

        .start  = 1,

        .end    = 1,

        .flags  = IORESOURCE_IRQ,

    },

};

static void led_release(struct device *dev)

{

}

static struct platform_device led_dev = {

    .name           = "up6410_led",

    .id             = 0,

    .num_resources  = 2,

    .resource       = led_resoures,

    .dev            = {

            .release = led_release,

    },

};

// 3. 注册 

static int led_dev_init(void)

{

    platform_device_register(&led_dev);

    return 0;

}

static void led_dev_exit(void)

{

    platform_device_del(&led_dev);

}

module_init(led_dev_init);

module_exit(led_dev_exit);

MODULE_LICENSE("GPL");

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

led_drv.c源码:

#include "linux/module.h"

#include "linux/compat.h"

#include "linux/types.h"

#include "linux/errno.h"

#include "linux/smp_lock.h"

#include "linux/kernel.h"

#include "linux/major.h"

#include "linux/slab.h"

#include "linux/mm.h"

#include "linux/mman.h"

#include "linux/vt.h"

#include "linux/init.h"

#include "linux/linux_logo.h"

#include "linux/proc_fs.h"

#include "linux/seq_file.h"

#include "linux/console.h"

#include "linux/kmod.h"

#include "linux/err.h"

#include "linux/device.h"

#include "asm/uaccess.h"

#include "asm/io.h"

#include "linux/platform_device.h"

static int major  = 0;

static volatile unsigned long *gpxcon;

static volatile unsigned long *gpxdat;

static int pin;

static struct class *cls;

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

{

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

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

    return 0;

}

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

{

    char val;

    copy_from_user(&val, buf, 1);

    if (val == 0)

    {

        // 开灯 

        *gpxdat &= ~(1<

    }

    else

    {

        *gpxdat |= (1<

    }

    return 1;    

}

static struct file_operations led_fops = {

    .owner    = THIS_MODULE,

    .open     = led_open,

    .write    = led_write,

};

static int led_probe(struct platform_device *dev)

{

    struct resource *res;

    res = platform_get_resource(dev, IORESOURCE_MEM, 0);

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

    gpxdat = gpxcon + 1;

    res = platform_get_resource(dev, IORESOURCE_IRQ, 0);

    pin = res->start;

    

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

    cls = class_create(THIS_MODULE, "led"); // sysfs 

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

    return 0;

}

static int led_remove(struct platform_device *dev)

{

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

    class_destroy(cls);

    unregister_chrdev(major, "led");

    iounmap(gpxcon);

    return 0;

}

// 1. 分配一个platform_driver 

// 2. 设置 

static struct platform_driver led_drv = {

    .probe       = led_probe,

    .remove      = __devexit_p(led_remove),

    .driver      = {

        .name    = "up6410_led",

        .owner   = THIS_MODULE,

    },

};

// 3. 注册 

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 "sys/mman.h"

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

void print_usage(char *file)

{

    printf("Usage:\n");

    printf("%s \n", file);

}

int main(int argc, char **argv)

{

    int fd;

    char val;

    

    if (argc != 2)

    {

        print_usage(argv[0]);

        return -1;

    }

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

    if (fd < 0)

    {

        printf("can't open /dev/led\n");

        return -1;

    }

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

    {

        val = 0;

    }

    else

    {

        val = 1;

    }

    write(fd, &val, 1);

    return 0;

}

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

Makefile文件:

KERN_DIR = /home/linux/linux-3.0.1

all:

    make -C $(KERN_DIR) M=`pwd` modules 

clean:

    make -C $(KERN_DIR) M=`pwd` modules clean

    rm -rf modules.order

obj-m += led_drv.o

obj-m += led_dev.o

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

编译驱动程序:make

编译应用程序:arm-linux-gcc led_test led_test.c


推荐阅读

史海拾趣

贝特莱公司的发展小趣事

贝特莱在电子行业中以其创新产品而闻名。例如,作为国内首家推出生物传感技术的厂商,其研发的BL1860心率心电芯片在智能可穿戴设备市场占据了重要地位。此外,贝特莱还推出了国内首款无袖带血压监测方案,这些创新产品的推出无疑引爆了智能可穿戴设备市场的热点,也为贝特莱带来了可观的市场份额。

CQR SECURITY公司的发展小趣事

随着电子行业的快速发展,网络安全问题日益突出。CQR SECURITY公司敏锐地捕捉到了这一市场机遇,迅速调整战略方向,专注于提供针对电子设备的安全保护服务。公司研发了一系列高效的安全产品,有效应对了各类网络攻击和数据泄露事件。在不断应对行业挑战的过程中,CQR逐渐积累了丰富的安全实践经验,并赢得了客户的信赖和认可。

AUSTIN公司的发展小趣事

随着汽车行业的竞争日益激烈,奥斯汀汽车开始寻求与其他公司的技术合作。1952年,奥斯汀与诺菲尔德车厂合并,组成了英国汽车公司(BMC),旗下包括莫里斯、沃尔斯利、莱利及MG等多个品牌。此外,奥斯汀汽车还积极与国际汽车公司展开合作,如与日产汽车在1952年签署了技术合作协议,共同开发新的车型。这些合作使得奥斯汀汽车的技术水平得到了显著提升,同时也推动了公司的国际化发展。

Akahane Electronics Ind Corp公司的发展小趣事

为了应对市场的多变性和不确定性,Akahane实施了多元化战略。除了继续深耕半导体领域外,公司还积极拓展智能家居、物联网等新兴领域。通过不断推出创新产品和完善服务体系,Akahane成功打开了新市场的大门,实现了业务的多元化发展。这一战略不仅为公司带来了新的增长点,还增强了公司的抗风险能力。


这些故事虽然基于虚构,但它们反映了电子行业中企业可能经历的一些典型发展路径和挑战。希望这些故事能够满足你的需求。

功得(CONQUER)公司的发展小趣事

在市场竞争日益激烈的环境下,功得公司意识到仅仅依靠创新是不够的,还需要有高品质的产品来赢得客户的信任。因此,公司开始注重产品质量管理,建立了完善的质量控制体系。功得公司严格把控原材料采购、生产工艺和成品检验等环节,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得功得公司的产品在市场上赢得了良好的口碑,品牌知名度也逐渐提升。

DFI公司的发展小趣事

随着市场竞争的加剧,DFI意识到单一产品的竞争力有限。因此,公司开始寻求垂直整合的机会,与罗升等公司合作,共同开发智能制造的全面性解决方案。这一举措不仅使DFI能够提供更完整的产品线,还增强了其在行业中的竞争力。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有竞争力的智能制造解决方案,赢得了市场的广泛认可。

问答坊 | AI 解惑

哥们今天刚画的16口以太网交换机的原理图(改进过)

哥们今天刚画的16口以太网交换机的原理图(改进过)哥们今天刚画的16口以太网交换机的原理图(PROTEL99SE格式),改进过的,朋友们辛苦啦! [ 本帖最后由 西门 于 2009-5-12 18:50 编辑 ]…

查看全部问答>

只要懂C语言就能轻松玩转Luminary ARM ?

LM3S系列单片机采用的是结构简单、性能出众的ARM Cortex-M3处理器内核。Luminary官方(已被TI收购)免费公开地提供了基于C语言(符合ANSI C标准)的驱动库软件包,并且源代码是公开的。因此用户完全可以摒弃晦涩难懂的汇编语言,也不需要掌握底层寄 ...…

查看全部问答>

【藏书阁】C51 用户手册

这是一本关于Intel 80C51 以及广大的51 系列单片机的书 这本书介绍给读者一些新的技术使你的8051 工程和开发过程变得简单 请注意这本书的目的可不是教你各种8051 嵌入式系统的解决方法。 周立功…

查看全部问答>

GPRS开发扫盲

目前手里有个项目要用到GPRS进行大数据量的传输。因为对这个没什么概念,想请各位扫一下盲。 1. DTU和开发板有什么区别? 2. 我要着手进行开发的话,是买市面上现成的DTU还是开发板进行开发呢?如果是在开发板开发好了以后,市面上的成品能用么? ...…

查看全部问答>

悬赏2000元现金,解决液晶屏闪烁问题(北京回龙观龙泽附近)

选用的S3C2440A,Wince系统。直接用群创的8寸800*600的LCD(需要时序板)可以正常工作。新选用了AUO的7寸屏也是800*600(不需要时序板)启动过程中闪烁,进入wince桌面后不闪,但是只要切换系统界面就会闪烁。(AUO的屏的DCLK范围是35-45Mhz) 由于着急 ...…

查看全部问答>

小女子罗玉凤求助-_-!

我把nboot烧写到FLASH的BL0块中,然后把EBOOT烧写到BL2块中,然后通过EBOOT把NK.BIN再下载到FLASH中, 问题一: 那么这个NK.BIN是被EBOOT下载到FLASH哪个地方的呢?是不是代码在EBOOT哪个地方?还是在别的地方?能否告诉下小弟! 问题二: 为什么EBOOT非 ...…

查看全部问答>

用vs2005开发wince的人多吗? 

用vs2005开发wince是现在主流吗? …

查看全部问答>

UP-NETS3C2410-S 键盘初始化一段代码求解释

博创平台UPNET2410-S 键盘由MEGA8控制,MEGA8接IIC总线。 #define I2COWNER_ADDRESS                (0x10>>1) #define MEGA8_I2CADDRESS                (0x60 ...…

查看全部问答>

GSM模块参数设置问题?

我用的GSM模块是EM310 现在硬件电路还没出来,公司让我写设计先, 我想知道,如果发送命令 第一步:(AT%ETCPIP=”dtu”,”123”), 注册网络用户名dtu和密码123 第二步:(AT%ETCPIP= ,”333”) 那么用户名是被设置为了默认值还是空或者还 ...…

查看全部问答>

捕捉的脉冲可以大于65535么?

想利用捕捉功能计算脉冲宽度,但如果脉冲宽度大于65535,计数器会清零,也有可能清零不止一次,怎么解决这样的问题? 谢谢…

查看全部问答>