micro2440写的第一个驱动-LED

发布者:leader5最新更新时间:2022-07-08 来源: csdn关键字:micro2440  驱动  LED 手机看文章 扫描二维码
随时随地手机看文章

这是学习驱动开发中,在MICRO 2440开发板上写的第一个驱动程序。实现对S3C2440的GPIO的控制,是一个ARM-LINUX上最简单的驱动。本驱动通过S3C2440的GPB5~8控制4个LED,属MISC(混杂)驱动,其实MISC也是一种特殊的字符驱动,只不过是把主设备号为10的字符驱动归类为MISC类驱动。


MISC类驱动结构如下:


static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

  };


minor为指定次设备号,等于MISC_DYNAMIC_MINOR表示为动态获取次设备号。


name为设备名。


fops为 file_operations结构,设备的操作函数指针集合。


file_operations结构:


static struct file_operations dev_fops = {

.owner = THIS_MODULE,

.ioctl = sbc2440_leds_ioctl,

  };


该设备省略了OPEN和RELESE操作函数,即默认为打开状态。我们只需要对IO口操作就可以实现LED灯的亮和灭,所以只需要一个IOCTL操作函数就可以满足要求了。


GPIO口的设置:


S3C2440设置GPIO口主要是设置3个寄存器。分别为GPxCON, GPxDAT, GPxUP(x=A….J)。


GPxCON用于设置IO口的功能,每两位对应一个IO口,输入=00,输出=01;特殊功能=10;


GPxDAT为IO口的数据寄存器,每一位对应一个IO口。


GPxUP为是否使用上拉电阻,0为使用,注意的是并不是每组IO口都有内部集成上拉电阻,如果没有集成,则没该寄存器。


设置这三个寄存器相对应的函数为:s3c2410_gpio_cfgpin,s3c2410_gpio_setpin。


驱动程序代码:


加载函数:


static int __init dev_init(void)

{

int ret;

 

int i;

for (i = 0; i < 4; i++) {

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

s3c2410_gpio_setpin(led_table[i], 0);

}

 

ret = misc_register(&misc);

 

printk (DEVICE_NAME"tinitializedn");

 

return ret;

}


在加载函数里,主要完成的就是初始化IO口和注册一个MISC类设备,MISC类在misc_register这个调用里,会帮我们根据struct miscdevice里面的成员帮我们注册一个字符设备,所以我们这个MISC的驱动加载函数比较短。


卸载函数:


static void __exit dev_exit(void)

  {

misc_deregister(&misc);

  }


在卸载函数里,只需要调用misc_deregister卸载掉MISC设备就OK了。


IOCTL函数:


static int sbc2440_leds_ioctl(

struct inode *inode, 

struct file *file, 

unsigned int cmd, 

unsigned long arg)

{

switch(cmd) {

case 0:

case 1:

if (arg > 4) {

return -EINVAL;

}

s3c2410_gpio_setpin(led_table[arg], !cmd);

return 0;

default:

return -EINVAL;

}

}


在这个MISC设备里,主要用到的是控制函数。通过之前介绍的操作IO寄存器的函数,我们就可以很轻松地对IO口进行控制。


编译、加载:


把源码放进/drivers/char下。


修改内核源码目录linux-2.6.32.2/drivers/char下的Kconfig文件,添加以下文本把驱动程序加进代码树。


config LOCKER_LEDS             


tristate "Locker_Liang leds"


depends on MACH_MINI2440


default m if MACH_MINI2440


help


Locker_Liang leds.


config"为定义了一新的配置选项。Tristate为选项名称。depends on为基于哪类处理器。Default表示如果上一个处理器不可用则默认选这个。Help为帮助信息,下一行为帮助信息。Kconfig的语法详细说明看Kconfig文档。


修改Makefile,添加


obj-$(CONFIG_LOCKER_LEDS)+= MY_leds.o


这里注意的是LOCKER_LEDS一定要和Kconfig上的相同,.o文件也要和源文件名相同。


在linux-2.6.32.2目录输入make menuconfig,在 Device Drivers -》Character devices中选中我们添加的模块,选为M,即编译为模块方式。


输入make modules编译模块。这时在/drivers/char就会生成一个MY_leds.ko文件。把该文件拷贝到开发板上,输入insmod MY_leds.ko 就可以加载模块到内核中。并且自动生成设备文件。输入rmmod MY_leds.ko可以卸载模块。


这样做就可以对设备操作了,但还有一个问题就是复位后,还要重新加载驱动模块和重新生成设备文件。这时我们可以在/etc/init.d/rcS文件里,加上加载驱动模块和生成设备文件的命令,这样每次开机后都会自动完成设置。


完整代码:


#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 "MY_leds"

 

static unsigned long led_table [] = {

S3C2410_GPB(5),

S3C2410_GPB(6),

S3C2410_GPB(7),

S3C2410_GPB(8),

};

 

static unsigned int led_cfg_table [] = {

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

S3C2410_GPIO_OUTPUT,

};

 

static int sbc2440_leds_ioctl(

struct inode *inode, 

struct file *file, 

unsigned int cmd, 

unsigned long arg)

{

switch(cmd) {

case 0:

case 1:

if (arg > 4) {

return -EINVAL;

}

s3c2410_gpio_setpin(led_table[arg], !cmd);

return 0;

default:

return -EINVAL;

}

}

 

static struct file_operations dev_fops = {

.owner = THIS_MODULE,

.ioctl = sbc2440_leds_ioctl,

};

 

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

};

 

static int __init dev_init(void)

{

int ret;

 

int i;

for (i = 0; i < 4; i++) {

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

s3c2410_gpio_setpin(led_table[i], 0);

}

 

ret = misc_register(&misc);

 

printk (DEVICE_NAME"tinitializedn");

 

return ret;

}

 

static void __exit dev_exit(void)

{

misc_deregister(&misc);

}

 

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Locker_Liang Inc.");


测试程序:


  #include

  #include

  #include

  #include

  

  #define IOCTL_LED_ON    1

  #define IOCTL_LED_OFF   0

  

  void usage(char *exename)

  {

      printf("Usage:n");

      printf("    %s n", exename);

      printf("    led_no = 1, 2, 3 or 4n");

  }

  

  int main(int argc, char **argv)

  {

      unsigned int led_no;

      int fd = -1;

  

      if (argc != 3)

          goto err;

          

      fd = open("/dev/MY_leds", 0);  // 打开设备

      if (fd < 0) {

          printf("Can't open /dev/ledsn");

          return -1;

      }

      

      led_no = strtoul(argv[1], 0, 0) - 1;    // 操作哪个LED?

      if (led_no > 3)

          goto err;

      

      if (!strcmp(argv[2], "on")) {

          ioctl(fd, IOCTL_LED_ON,led_no);    // 点亮它

      } else if (!strcmp(argv[2], "off")) {

          ioctl(fd, IOCTL_LED_OFF,led_no);   // 熄灭它

      } else {

          goto err;

      }

      

      close(fd);

      return 0;

      

  err:

      if (fd > 0) 

          close(fd);

      usage(argv[0]);

      return -1;

  }


测试指令   ./test 1 on 


关键字:micro2440  驱动  LED 引用地址:micro2440写的第一个驱动-LED

上一篇:Linux(AT91SAM9260)增加UBIFS文件系统支持
下一篇:移植U-BOOT-2.14.07至MICRO2440开发板

推荐阅读最新更新时间:2024-11-13 18:34

地平线与比亚迪达成战略合作,驱动汽车产业智能化转型
在比亚迪完成对汽车智能芯片企业地平线的战略投资之后,地平线与比亚迪于3月2日上午在深圳比亚迪总部举行战略合作签约仪式。依托比亚迪深厚的智能化技术积淀和深度的垂直整合能力,与地平线领先的汽车智能芯片及算法能力,双方将形成强强联合的矩阵,共同推进科技研发层面的纵深探索,加速攻坚和布局智能驾驶前沿技术,加速智能汽车的研发与量产落地。 比亚迪股份有限公司董事长兼总裁王传福、比亚迪半导体股份有限公司总经理陈刚、比亚迪财务处总经理周亚琳、比亚迪采购处总经理王渤、比亚迪产品规划及汽车新技术研究院院长杨冬生、比亚迪总裁办公室主任李巍、比亚迪股份有限公司董事会秘书兼投资处总经理李黔;地平线创始人兼CEO余凯、联合创始人兼CTO黄畅、联合创始人兼
[嵌入式]
地平线与比亚迪达成战略合作,<font color='red'>驱动</font>汽车产业智能化转型
汽车CIS专题 | 【ADAS (四)】你知道吗,汽车“眼”中的红不是红
揭秘汽车如何准确感知马路上的“电子交警”-LED信号。 引言: 消费者、政策/法规、市场三合力,不断推动ADAS渗透率提升。 2022年3月国内新车L2级配套量接近41.6万,渗透率近30%。ADAS成标配,CIS如何升级? 豪威集团汽车CIS系列专题ADAS篇将分5期,每期一个硬核知识点,助您详尽了解ADAS领域应用、技术趋势与车规产品。 上期科普了为什么ADAS前视摄像头尤其要达到140dB HDR。本期将聚焦汽车如何准确感知马路上的“电子交警”-LED信号。 随着LED在街道照明和前照灯中的使用越来越多,被称为“LED闪烁”的现象正在成为机器视觉系统需要解决的关键问题,它导致LED交通信号不能被
[汽车电子]
汽车CIS专题 | 【ADAS (四)】你知道吗,汽车“眼”中的红不是红
Mouser现已开始供货Cree XLamp MK-R LED
MK-R LED实现LED业界里程碑式的200流明/瓦 2013年7月10日 – Mouser Electronics宣布备货Cree公司的XLamp® MK-R LED;该产品采用基于SC³技术的下一代LED平台,具有高达200流明/瓦的性能。 Cree XLamp® MK-R LED采用Cree公司革命性的SC³技术平台,可提供高达200流明/瓦(1W、25ºC时)的性能,使照明制造商能够创建下一代高流明室内外LED照明系统。 MK-R LED具有EasyWhite®色温,可为仅使用一个LED的设计提供业内最佳的颜色一致性。 对于使用多个LED的系统,MK-R可让制造商使用较少的LED,同时依然保持光照输出性能和质
[电源管理]
实现云计算的另类思路,用GPU驱动超级计算机
为满足日益增长的云计算和在线游戏的数据处理需求,三家美国公司提议在“超级计算机”中连接数以千计的图形处理器以提供超运算能力。 图形处理器公司NVIDIA正在与IDT、Orange Silicon Valley一道开发一个可扩展、低延迟的包含2000个Tegra K1移动处理器的计算机集群。 该系统采用IDT提供的RapidIO互连器件连接各个处理器。它支持处理器节点之间高达16Gbit/s的数据交换。 在一个19英寸的1U板上将部署60个处理器节点,对应于一个机架上将有超过2000个节点。 每个1U服务器可以提供23Tflops的计算能力,而每机架将提供超过800Tflops的处理能力。 它的计算密度是当
[嵌入式]
部分Mac用户称系统将打印机驱动程序当成恶意软件
一些用户报告,由于 macOS 错误声称某些软件为恶意软件,他们无法再使用惠普打印机进行打印,或者无法继续通过专用应用来播放 Amazon Music。 外媒 AppleInsider 称,用户报告他们的 Mac 突然弹出通知,称其 HP 打印机包含恶意软件:“会损坏您的计算机”。另外,其他用户报告的是同一问题,但与 Amazon Music 应用有关。 在这种情况下,尝试启动应用程序或仅使用 Mac,都会弹出一个对话框。报告说有恶意软件会损坏 Mac,并建议用户将特定文件移至废纸篓。 该文件可以是 Amazon Music 应用程序,也可以是称为 HP Device Monitoring.framework 的惠普打
[手机便携]
部分Mac用户称系统将打印机<font color='red'>驱动</font>程序当成恶意软件
东芝推低输入电流驱动、轨对轨输出、栅极驱动光电耦合器
东京 东芝公司(TOKYO:6502)旗下存储与电子元器件解决方案公司今日宣布推出一个采用低高度封装的低输入电流驱动、轨至轨输出、栅极驱动光电耦合器系列,该系列产品支持从微控制器无缓冲直接驱动低到中等功率IGBT和MOSFET。三款新产品 TLP5771 , TLP5772 和 TLP5774 出货即日启动。 新的光电耦合器产品阈值输入电流为2mA(最大值),仅为东芝现有产品 4mA(最大值)的一半,支持从微控制器无缓冲直接驱动低到中等功率IGBT和MOSFET。该新系列提供1A、2.5A和4A三个级别的峰值输出电流,确保它们满足各种用户需求。 与15V(最小值)的东芝现有产品 相比,新的光电耦合器具有轨至轨输
[电源管理]
东芝推低输入电流<font color='red'>驱动</font>、轨对轨输出、栅极<font color='red'>驱动</font>光电耦合器
基于GD32驱动BLDC电机(1)定时器和PWM
心血来潮买了几个BLDC电机,准备这次就使用苹果派这块板子试一下BLDC电机的控制。 苹果派这块板子的书籍和例程很多,要驱动电机首先要配置定时器,产生可控的PWM脉冲。 趁快递还没到,先学习一下PWM的生成方式: 按照例程和书籍配置寄存器TIMER2: static void ConfigTimer2(unsigned short arr, unsigned short psc) { timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数 //使能RCU相关时钟 rcu_periph_clock_enable(R
[单片机]
基于GD32<font color='red'>驱动</font>BLDC电机(1)定时器和PWM
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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