历史上的今天

今天是:2024年11月14日(星期四)

2019年11月14日 | TQ2440开发板 Linux第一个驱动--点灯

发布者:caijt 来源: 51hei关键字:TQ2440开发板  Linux  驱动  点灯 手机看文章 扫描二维码
随时随地手机看文章

我用的是TQ2440开发板,这个程序是参考韦东山的.

4盏LED灯

以下是驱动程序

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


static struct class *firstdrv_class;

static struct class_device        *firstdrv_class_dev;


volatile unsigned long *gpbcon = NULL;

volatile unsigned long *gpbdat = NULL;



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

{

        //printk("first_drv_openn");

        /* 配置gpb5,6,7,8为输出 */

        *gpbcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)) | (0x3<<(8*2)));

        *gpbcon |= ((0x1<<(5*2)) |(0x1<<(6*2)) | (0x1<<(7*2)) | (0x1<<(8*2)));

        return 0;

}


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

{

        int val;


        //printk("first_drv_writen");


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


        if (val == 1)

        {

                // 点灯

                *gpbdat &= ~((1<<5) | (1<<6) | (1<<7) | (1<<8));

        }

        else

        {

                // 灭灯

                *gpbdat |= (1<<5) | (1<<6) | (1<<7) | (1<<8);

        }

        

        return 0;

}


static struct file_operations first_drv_fops = {

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

    .open   =   first_drv_open,     

        .write        =        first_drv_write,           

};



int major;

static int first_drv_init(void)

{

        major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核


        firstdrv_class = class_create(THIS_MODULE, "firstdrv");


        firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */


        gpbcon = (volatile unsigned long *)ioremap(0x56000010, 16); //0x56000010是的GPIOB的

        gpbdat = gpbcon + 1;

        printk("first_drv_init...n");


        return 0;

}


static void first_drv_exit(void)

{

        unregister_chrdev(major, "first_drv"); // 卸载


        class_device_unregister(firstdrv_class_dev);

        class_destroy(firstdrv_class);

        iounmap(gpbcon);

        printk("first_drv_exit...n");

}


module_init(first_drv_init);

module_exit(first_drv_exit);



MODULE_LICENSE("GPL");


以下是测试程序

#include

#include

#include

#include


/* firstdrvtest on

  * firstdrvtest off

  */

int main(int argc, char **argv)

{

        int fd;

        int val = 1;

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

        if (fd < 0)

        {

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

        }

        if (argc != 2)

        {

                printf("Usage :n");

                printf("%s n", argv[0]);

                return 0;

        }


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

        {

                val  = 1;

        }

        else

        {

                val = 0;

        }

        

        write(fd, &val, 4);

        return 0;

}



关键字:TQ2440开发板  Linux  驱动  点灯 引用地址:TQ2440开发板 Linux第一个驱动--点灯

上一篇:u-boot 第一阶段启动流程
下一篇:为madplay编写应用程序

推荐阅读

许多的科技大片中,我们都会看到机器人的身影,许多的电影当中,还能看见机器人完全拥有了人类的性格和情感,甚至比很多的人更加聪明智慧。机器人还能和人类谈恋爱,或者帮人类完成许多人类不想做或者做不到的事情。在许许多多的广告中,我们可以看到人们对机器人的使用更加广泛了,比如用机器人给小朋友讲作业辅导功课的,还有机器人帮人打扫房间的,这就...
摘要:通过对穴位施加低频的脉冲电压刺激穴位神经释放内源性物质,从而达到减轻疼痛的作用已经被证实。基于此医学原理,本系统使用LabVIEW编写上位机控制界面,通过NIVISA模块驱动USB进行实时通信,采用高性能AVR主控芯片设计下位机,从而实现宽范围数字升压(12~100V)的高质量互补对称脉冲波稳定输出特性。在疼痛疾病的治疗以及医疗保健治未病等领域将有...
HMD Global于今年9月推出了诺基亚2.4和诺基亚3.4,这一主打性价比的智能手机提供了一些有趣的功能,例如多摄像头设置、不错的电池寿命等等。该公司透露,诺基亚2.4将从9月底开始在全球上市,但是却没有提及印度市场。日前据外媒mysmartprice消息,诺基亚2.4将于2020年11月在印度推出。诺基亚2.4搭载联发科Helio P22处理器,拥有2GB+32GB和3GB+64GB两种内...

史海拾趣

问答坊 | AI 解惑

有调通过marvell wifi 8686 sdio接口驱动来讨论下???

正在调sdio接口的wifi 8686驱动,sdio确认好的,读写寄存器,加载固件都没问题。有以下问题: 1. 我是直接把驱动放在bsp中编的,wince启动后自动加载wifi驱动, 并且这个wifi驱动会自行搜索热点。我的理解是wifi驱动加载固件启动完wifi芯片注册网络 ...…

查看全部问答∨

protel 99se中,sp232E在哪个库中?

如题。 protel 99se中,SP232E所在的库叫什么?…

查看全部问答∨

lstAdd的使用问题!

    SESSION_POS_S *pTestpos1, *pTestpos2, *pTestpos3, *pPos;     LIST *pMyList = NULL;     int NodeIndex = 0;             DPRINT("-------- lstAdd测试 -------\\n ...…

查看全部问答∨

看看我的成果

本人长期从事单片机开发应用,积累了一定的经验。本人将毕生研究心得集成了文字,放在我的博客里,希望大家光临指导,并给点意见。我的博客地址;http://blog.mcuol.com/user/Article/500.html…

查看全部问答∨

f2812AD转换波动很大,不知是什么原因?

用电位器输出一个电压值,从我watch窗口看到的ADCresult值都在变化,变化比较大。如0xabc0,b为都会能差4,帮忙分析一下可能那里设置不对。谢谢!…

查看全部问答∨

ez430-rf2500遇到了问题。。求指点

 想请问你一下 那个ez430-rf2500为什么ed连上电池两个灯还是不闪。。ap的红灯在闪烁。。并且PC上温度只有一个ap温度显示。。就是说ed的没有反应。。好像是没有连接到网络。。后来又折腾了一下。。现在ap的红绿灯都在闪。。但是ed还是没反应。 ...…

查看全部问答∨

特权同学写的sdram控制器读出的数据全是FF?

最近在用特权同学写的sdram控制器,但是串口读出的数据全是FF,不知道出错在什么地方?用没用过调通的朋友,不吝赐教,万分感谢啊…

查看全部问答∨

高手帮忙看一下这程序

#include<reg51.h>    //  包含51单片机寄存器定义的头文件unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数字0~9的段码unsigned char int_time ; //中断次数计数变量unsigned ...…

查看全部问答∨

Verilog HDL信号类型不一致

module main (                       ....); wire   clk1MHz; // 产生1MHz的时钟波形 // 输入为20MHz的时钟 clock_divider  instT1MHz &nb ...…

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

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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