ARM嵌入式LINUX设备驱动设计入门学习

发布者:LuckyDaisy最新更新时间:2016-05-26 来源: eefocus关键字:ARM  LINUX  设备驱动 手机看文章 扫描二维码
随时随地手机看文章
  经过一段时间的学习之后,也开发了一些小型的驱动,正如我之前一篇中写到得,现在我就来写一下在ARM嵌入式LINUX下如何设计驱动的框架。

        在这里我用的板子是micro2440板子,板子上的linux版本是2.6.13。因为我在前一篇介绍了驱动编程的两种框架设计,所以现在我就来分别写一下这两种框架设计的程序。

 

开发平台:RED HAT LINUX 9(Linux 2.4.18)

开发板:micro2440(友善之臂)(Linux 2.6.13)

交叉编译工具:arm-linux-gcc-3.4.1

---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

2.4内核驱动框架:

static int __init leds_init(void)
{
 int result;
 int i;

 result = register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops);
 if(result < 0){
  printk(DEVICE_NAME "can't register major number/n");
  return result;
 }
 
// static devfs_handle_t devfs_handle;
// devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, LED_MAJOR, &leds_fops, NULL);

/*

*之所以不用devfs_register,而用devfs_mk_cdev,原因是因为在linux2.6内核里没有devfs_register函数,而改用*devfs_mk_cdev

*/
 devfs_mk_cdev(MKDEV(LED_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);

 for(i = 0; i < 4; i++){
  s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
  s3c2410_gpio_setpin(led_table[i], 1);
 }

 printk(DEVICE_NAME "initialized/n");
 return 0;
}

static void __exit leds_exit(void)
{
 devfs_remove(DEVICE_NAME);
 unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}

---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

2.6内核驱动框架:

static int __init leds_init(void)
{
 int result;
 int i;
 dev_t dev = 0;

 dev = MKDEV(LED_MAJOR, 0);
 result = register_chrdev_region(dev, 1, DEVICE_NAME);
 if (result < 0) 
 {
  printk(KERN_WARNING "DEMO: can't get major %d/n", LED_MAJOR);
  return result;
 }
 
 LED_devices = kmalloc(sizeof(struct DEMO_dev), GFP_KERNEL);
 if (!LED_devices)
 {
  result = -ENOMEM;
  goto fail;
 }
 memset(LED_devices, 0, sizeof(struct DEMO_dev));

 cdev_init(&LED_devices->cdev, &leds_fops);
 LED_devices->cdev.owner = THIS_MODULE;
 LED_devices->cdev.ops = &leds_fops;
 result = cdev_add (&LED_devices->cdev, dev, 1);
 if(result)
 {
  printk(KERN_NOTICE "Error %d adding DEMO/n", result);
  goto fail;
 }
 devfs_mk_cdev(MKDEV(LED_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);

 for(i = 0; i < 4; i++){
  s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
  s3c2410_gpio_setpin(led_table[i], 1);
 }

 printk(DEVICE_NAME "initialized/n");
  return 0;
fail:
 leds_exit();
 return result;

}

static void __exit leds_exit(void)
{
 dev_t devno = MKDEV(LED_MAJOR, 0);

 if (LED_devices) 
 {
  devfs_remove(DEVICE_NAME);
  cdev_del(&LED_devices->cdev);
  kfree(LED_devices);
 }

 unregister_chrdev_region(devno,1);
}

---------------------------------------------------------------------

---------------------------------------------------------------------

---------------------------------------------------------------------

在这里我事先都写好了文件才做结构体,和操作函数ioctl,下面我就来介绍介绍

static int 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;
 }
}

关键字:ARM  LINUX  设备驱动 引用地址:ARM嵌入式LINUX设备驱动设计入门学习

上一篇:基于ARM的W5100底层驱动设计
下一篇:基于STM32的USB枚举过程学习笔记(一)

推荐阅读最新更新时间:2024-03-16 14:54

Cortex内核拿下大半江山 MCU之争渐入高潮
      随着NXP发布LPC1700系列Cortex-M3内核的MCU,围绕着ARM新宠Cortex内核的竞争已经进入白热化。   目前Cortex-M3处理器内核的授权客户数已达到28家,包括东芝、ST、Ember、Accent、Actel、ENERGY、ADI、NXP、TI、Atmel、Broadcom、Samsung、Zilog和Renesas,其中ST、TI、NXP、Atmel和东芝已经推出基于Cortex-M3的MCU产品。 在这5家中,通过收购Luminary入局的TI和ST属于最先吃螃蟹的人,到现在已经成果初现;NXP则凭借最新的V2版内核100MHz主频的LPC1700系列大有后来居上之势;至于ATMEL和TO
[嵌入式]
ARM CPU与Intel x86 CPU性能比较
随着移动互联网时代的到来,Qualcomm(高通)、Texas Instruments(德州仪器)等基于ARM架构的CPU受到越来越多人的关注,而昔日王者的Intel x86架构由于功耗问题,在移动互联网似乎举步维艰。 Intel x86架构对比于ARM架构来说,性能强大,功耗较高是大家都知道的事实。那Intel x86架构的CPU性能究竟比ARM架构的强多少呢?下面我们对单个Core做一个简单的评测。 我的PC机CPU:Intel Pentium Dual-Core CPU E5300 2.60GHz(Launched 2008Q1 x86) 我手机的CPU:Qualcomm Snapdragon S2 MSM8255 1.0
[单片机]
基于ARM9与LINUX的RS485总线的通信接口设计
  摘要:在ARM9处理器S3C2440上设计RS485通信接口,实现与总线上其他设备的通信,利用ARM9处理器内部集成的UART外设和RSM485CT模块组成RS485通信硬件接口,在嵌入式Linux系统下设计RS485通信程序实现与RS485总线上的其他外设间的数据互通。实验效果良好,表明该设计是行之有效的。文中在介绍了通信接口的硬件设计、Linux下RS485驱动设计、通信程序设计的同时,重点介绍了Linux系统下RS485通信程序的编写方法以及RS485总线上设备通信的实现过程。   0引言   随着ARM处理器应用的范围的不断深入,根据需求的不同ARM提供的外设也越来越丰富,常用的通信接口有RS232、RS485、C
[单片机]
基于<font color='red'>ARM</font>9与<font color='red'>LINUX</font>的RS485总线的通信接口设计
利用半导体压力传感器和ARM实现便携式心血管无创检测系统
目前对心血管健康状况的检测方法大多数是应用于医院的临床诊断,有的是有创伤性的,给人体带来痛苦甚至感染;有的需要专业医生操作,检测过程非常繁琐。特别是大多数心血管功能参数的检测仪器比较笨重,价格不菲,不适用于普通家庭用户的使用。 本文利用半导体压力传感器获得桡动脉处的脉搏波信号,压力传感器是工业实践中最为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。另有医用压力传感器。压电传感器中主要使用的压电材料包括有石英、酒石酸钾钠和磷酸二氢胺。其中石英(二氧化硅)是一种天然晶体,压电效应就是
[单片机]
利用半导体压力传感器和<font color='red'>ARM</font>实现便携式心血管无创检测系统
linux内核中的文件描述符(三)--fd的回收
Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) 1.close函数 上图说明了close(fd)的执行过程,主要包括两部分:释放文件描述符fd,关闭文件file。 view plain copy print ? //fs/open.c asmlinkage long sys_close(unsigned int fd) { struct file * filp; struct files_struct *files = current- fi
[单片机]
<font color='red'>linux</font>内核中的文件描述符(三)--fd的回收
关于ARM汇编中字符串表达式及运算符总结如下
:LEN:X 返回字符串X的长度(字符数) :CHR:M 将0~255之间的整数转换为一个字符 :STR:X 将一个数字表达式或逻辑表达式转换为一个字符串.对于数字表达式,STR运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串T或F. X:LEFT:Y 返回某个字符串左端的一个子串.X为源字符串,Y表示返回的个数 X:RIGHT:Y 与LEFT对应 X:CC:Y 将Y连接到X的后面 :BASE:X 返回基于寄存器的表达式中寄存器的编号 :INDEX:X 返回基于寄存器的表达式中相对于其基址寄存器的偏移量 ?X 返回定义符号X的代码行所生成的可执行代码的字节数 :DEF:X
[单片机]
基于ARM的11种嵌入式操作系统大盘点
1、Android    Android 是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。Android 作为一个完全开源的操作系统,是由操作系统Linux、中间件以及核心应用程序组成的软件栈。通过 android SDK 提供的 API 以及相应的开发工具, 程序员可以很方便的开发android平台上的应用程序。其整个系统由应用程序,应用程序框架,应用程序库,Android运行库,Linux内核(Linux Kernel)五个部分组成。Android操作系统内置了一部分应用程序, 包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所有的程序都是用java
[单片机]
Arm 更新 Neoverse 产品路线图,实现基于 Arm 平台的人工智能基础设施
新闻 重点 : Arm 宣布推出两款基于全新第三代 Neoverse IP 构建的新的 Arm Neoverse 计算子系统 Arm Neoverse CSS V3 是高性能 V 系列产品组合中的首款 Neoverse CSS 产品;与 CSS N2 相比,其单芯片性能可提高 50% Arm Neoverse CSS N3 拓展了 Arm 领先的 N 系列 CSS 产品路线图;与 CSS N2 相比,其每瓦性能可提升 20% 在短短四个月内, Arm 全面设计 生态项目已吸引超过 20 家成员加入,并在三家领先的代工厂进行系统级芯片和芯粒设计 Arm 控股有限公司(纳斯达克股票代码:ARM,以下简称“Arm”)今
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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