历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2019年01月17日 | 2416开发记录三:简单LED驱动及应用程序

2019-01-17 来源:eefocus

写过了helloworld驱动,来点真格的驱动吧,最简单的就是led驱动了。 


参考mini2440的led驱动写法。写一个混合驱动(对于第一个简单的驱动来说好处多多)


驱动源码

驱动的源码如下:


#include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include


#define DEVICE_NAME "my2416leds"


#define LED_ON 0 //根据原理图,0点亮led,1熄灭led

#define LED_OFF 1

 //定义GPIO管脚

 static unsigned long led_table [] =

  {

      S3C2410_GPB(1),  //为什么是2410?,使用芯片是2416啊,原来他们的定义几乎是一致的。我在arch/arm/palt-s3c24xx/common-smdk.c文件中发现的。

      //S3C2410_GPF(1),

      //S3C2410_GPF(2),

      //S3C2410_GPF(3),

 };

 //设置管脚模式

 static unsigned int led_cfg_table [] =

  {

      S3C2410_GPIO_OUTPUT, //随内核版本中定义类型的变化,在arch/arm/mach-sc2410/include/mach/Regs-gpio.h文件中定义

      //S3C2410_GPIO_OUTPUT,

      //S3C2410_GPIO_OUTPUT,

      //S3C2410_GPIO_OUTPUT,

 };

 //unlocked_ioctl函数实现,注意,这里的函数参数和ioctl是不一样的,否则不会起作用。

//这里虽然是unlocked_ioctl函数,但是在应用程序中依然是调用ioctl函数来控制。

 static int my2416_leds_ioctl(struct file* filp, unsigned int cmd,unsigned long arg)

 {

   switch(cmd)

   {

      case LED_ON:

         s3c2410_gpio_setpin(S3C2410_GPB(1), LED_ON);

         break;

      case LED_OFF:

         //s3c2410_gpio_setpin(led_table[arg], !cmd);

         s3c2410_gpio_setpin(S3C2410_GPB(1), LED_OFF);

         break;

      default:

         printk("LED control:no cmd\n");

         printk("LED control are LED_ON or LED_OFF\n");

         return(-EINVAL);

   }

   return 0;

 }

 //dev_fops操作指令集

 static struct file_operations my2416Led_fops =

 {

      .owner =THIS_MODULE,

      .unlocked_ioctl =my2416_leds_ioctl,//这里必须是unlocked_ioctl而不是ioctl。

 };

 //第三步:混杂设备定义

 static struct miscdevice my2416Ledmisc =

  {

      .minor = MISC_DYNAMIC_MINOR,

      .name = DEVICE_NAME,

      .fops = &my2416Led_fops,

 };

 //第二步:gpio模式选择,设定管脚

 //  注册混杂设备

 static int __init dev_init(void)

 {

      int ret;


     int i;

      ////这里只定义了一个io口GPB1

      for (i = 0; i < 1; i++)

      {

          s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

          s3c2410_gpio_setpin(led_table[i], 0);

      }


     ret = misc_register(&my2416Ledmisc);


     printk (DEVICE_NAME"\tinitialized\n");


     return ret;

 }


static void __exit dev_exit(void)

 {

    misc_deregister(&my2416Ledmisc);

 }

 //第一步:module_init(dev_init);

 //    module_exit(dev_exit);

 module_init(dev_init);

 module_exit(dev_exit);

 MODULE_AUTHOR("Zhao Yidong

MODULE_LICENSE("Dual BSD/GPL");

MODULE_DESCRIPTION("A sample  2416 led dev");

MODULE_ALIAS("2416 led dev");


相应的makefile文件如下

#Makefile for .c

ARCH=arm

CROSS_COMPILE=arm-linux-

ifneq ($(KERNELRELEASE),)

    obj-m := my2416LedDev.o

else

#bbblack kernel

KERNELDIR ?= /home/zyd/soft/s3c2416/20140409_HELPER2416/Helper2416/source/s3c-linux.jyx

PWD := $(shell pwd)

modules:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

modules_install:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules_install

app: app.c

    $(CROSS_COMPILE)gcc -o app app.c

clean:

    $(MAKE) -C $(KDIR) M=$(PWD) clean

endif


执行命令make modules即可编译出my2416LedDev.ko 

使用minicom将驱动下载到板子上,使用insmod命令加载驱动即可。


测试应用程序编写

下面是相应的测试app文件编写。使用的开发环境是codeblocks


#include

#include

#include

#include

#include

#include

#include



#define DEVICE_NAME "/dev/my2416leds"


#define LED_ON 0

#define LED_OFF 1


int main()

{

    int fd;

    int ret;

    char *i;

    char count=0;


    printf("My2416 led dev test!\n");


    fd=open(DEVICE_NAME,O_RDWR);

    printf("fd=%d\n",fd);

    if(fd==-1)

    {

        printf("open device %s error\n",DEVICE_NAME);

    }

    else

    {

        for(count=0;count<10;count++)

        {

            ioctl(fd,LED_OFF);

            sleep(1);

            ioctl(fd,LED_ON);

            sleep(1);

        }

        ret=close(fd);

        printf("ret =%d\n",ret);

        printf("Close ledapp succeed!\n");

    }

    return 0;

}



编译成功后依然使用minicom下载到板子上。 

执行命令./my2416LedAPP即可看到GPB1控制的LED闪烁了。


推荐阅读

史海拾趣

ENOCEAN公司的发展小趣事

EnOcean GmbH成立于2001年,总部设在慕尼黑附近的奥伯兴。自创立之初,公司就专注于无线无源传输技术的研发,旨在提供一种无需外部电源、低维护成本的无线传感器解决方案。这种技术的核心在于能量转换器,能够收集环境中的微弱能量(如光能、振动能等),转化为电能供传感器使用。随着技术的不断完善,EnOcean逐渐在电子行业中崭露头角。

Eon公司的发展小趣事

在成立初期,E.ON面临着天然气产量下滑而消费量增长的挑战。为了应对这一局面,E.ON开始积极寻找天然气供应渠道,并与俄罗斯天然气工业集团(Gazprom)进行了多轮谈判。虽然初期合作并未如愿,但E.ON并未放弃,通过不断努力和策略调整,最终实现了与Gazprom的合作,为公司的天然气业务发展奠定了坚实基础。

DESCO公司的发展小趣事

DESCO公司成立于XX年代初,创始人[XXXXX]先生凭借其深厚的电子工程背景和敏锐的市场洞察力,决定投身于防静电产品的研发与生产。在创业初期,公司面临资金紧张、技术壁垒高等诸多困难,但[XXXXX]先生坚持技术创新,带领团队攻克了一个又一个技术难关,成功研发出首款高性能防静电垫,为公司的后续发展奠定了坚实基础。

CoolerMaster公司的发展小趣事

1992年,台北的一间出租屋内,林仁政凭借对电脑硬件的深厚理解与直觉,创立了讯凯国际股份有限公司,即现今广为人知的Cooler Master。初期,公司以生产个人电脑用散热器起家,目标明确——提供业界最好的散热方案。在没有资金、没有支持的情况下,林仁政独自完成了品牌的创建、日常事务的处理以及工作进程的管理。他的坚持与努力,使得Cooler Master逐渐在市场中站稳脚跟,开启了其在散热领域的传奇之旅。

Avic公司的发展小趣事

随着中国航空工业的快速发展,Avic公司不断加强在航空电子技术领域的研发和创新。公司成功研制出一系列先进的航空电子系统,这些系统不仅提高了飞机的性能和安全性,也为中国航空工业的国际竞争力奠定了坚实基础。Avic公司在航空电子领域的突破,不仅推动了国内航空工业的发展,也为国际航空市场带来了新的选择。

GE公司的发展小趣事

随着Avic公司在航空电子技术领域的不断发展和创新,其产品在国内外市场上的竞争力日益增强。公司成功拓展了国内外市场,市场份额稳步增长。这不仅体现了公司在航空电子领域的实力,也为中国航空工业的整体发展做出了积极贡献。

这五个故事虽然不能完全涵盖Avic公司在电子行业发展的所有细节,但希望能通过概括性的描述,为您展现该公司在这一领域的重要发展历程和取得的成就。需要注意的是,这些故事是基于公开资料和已知事实进行描述的,旨在客观呈现事实,而非进行主观评价。

问答坊 | AI 解惑

DSP28027

我是刚学习DSP的新人,有问题需要请教,DSP的库文件在软件的什么地方?如何调用库??谢谢…

查看全部问答>

小姚原创---痛批3G网络监控之三点害处。[说的很到位]

(完全原创,)黄婆卖瓜要自卖自夸,但今天我就要狠批一下我们自己的“瓜”。 3G网络监控好处很多,能解决很多普通网络监控解决不了的问题,也为网络监控的安装简单了很多,如公交车实时监控,长途客车的实时监控,无线机站的实时监控,轮船的实时 ...…

查看全部问答>

Winbond

请问Winbond  w78e52b-24是一个什么芯片啊,他的编程是不是跟51单片机的编程一样,两者兼容不?…

查看全部问答>

WDK怎么学啊?

我想自己编一个NDIS过滤器,搞了半天也不得要领,都说DDK过时了,学了几天WDK也没入门,大家帮帮我啊!!!…

查看全部问答>

请教如何为只有一个模式对话框的程序添加菜单

小弟的程序只有一个模式的对话框,没有createwindow主窗口, 想为对话框添加一菜单,就是右下角的“关于”选项, 参考新建程序默认的代码后,复制粘贴,可是没有效果(想了很多办法,并不是简单的复制粘贴)。 请教高手应如何添加,希望高手们能 ...…

查看全部问答>

ST的ARM加密性如何?

                                  …

查看全部问答>

TI真有意思,还送了个抽奖工具

先来个全家福   这个抽奖工具是不是挺熟悉的~~~   内部   一个12002模块,一个10501模块,一个12001芯片和一个23610芯片   10501好小! 23610恐怖,该用什么电源给它输入呢?…

查看全部问答>

linux 2.6中断注册相关变动

irqreturn_t int_interrupt(int irq,void * dev_id,struct pt_regs *regs);注册中断函数 extern int __must_check request_irq(unsigned int, irq_handler_t handler,unsigned long, const char *, void *); typedef irqreturn_t (*irq_hand ...…

查看全部问答>

诚招 模电工程师

浙江大学苏州工业技术研究院 核心创业团队 诚聘英才。我们拒绝平庸,渴望创新;我们拒绝单调,渴望在平凡的生活中收获激情。我们有麻省,剑桥,清华,浙大毕业的精英,我们也有拥有丰富经验的各行业前辈,现在我们独缺你! 工作职位:模拟电子工程 ...…

查看全部问答>