ARM-Linux自动创建设备结点

发布者:自在堂最新更新时间:2016-05-05 来源: eefocus关键字:ARM  Linux  自动创建  设备结点 手机看文章 扫描二维码
随时随地手机看文章
硬件平台:FL2440

内核版本:2.6.28

主机平台:Ubuntu 11.04

内核版本:2.6.39

1、首先配置busybox

busybox
Linux System Utilities --->
    [*] mdev
    [*] Support /etc/mdev.conf
    [*] Support command execution at device addition/removal

2、配置内核

3、修改文件系统里的/etc/init.d/rcS

#!/bin/sh
/bin/mount -a
/sbin/ifconfig eth0 192.168.0.3 up
#exec /usr/etc/rc.mouse
 

4、修改文件系统中/linuxrc文件

#!/bin/sh
#echo "mount /etc as ramfs"
#/bin/mount -n -t ramfs ramfs /etc
#/bin/cp -a /mnt/etc/* /etc

#/bin/mount -n -t ramfs ramfs /var/state/dhcp
#/bin/mount -n -t ramfs ramfs /var/log/boa
#/bin/mount -n -t ramfs ramfs /usr/Setting
#/bin/cp -a /mnt/Setting/* /usr/Setting

#/bin/mount -n -t ramfs ramfs /tmp
#/bin/cp -a /mnt/etc/* /etc

/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/shm

/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s

exec /sbin/init

4、修改/etcfstab

vi ./etc/fstab
#device mount-point type     options     dump     fsck order
none            /dev/pts        devpts  mode=0622       0 0
tmpfs           /dev/shm        tmpfs   defaults        0 0

这样编写驱动时不用手动创建设备结点文件了

下面是改写的使用混杂设备的ADC驱动程序,这样可以自动创建和删除设备结点了

 

[cpp] view plain copy
 
  1. #include   
  2. #include   
  3.   
  4. #include   
  5. #include  /*创建设备节点*/  
  6. #include   
  7. #include  /*定义DECLARE_WAIT_QUEUE_HEAD*/  
  8. #include  /*定义了irqreturn_t等*/  
  9. #include  /*request_irq disable_irq enable_irq*/  
  10.   
  11. #include   
  12. #include   
  13. #include   /*其中包含了#include "mach/irqs.h" */  
  14.   
  15. #include   
  16. #include   
  17.   
  18. #define ADC_MAJOR 102  
  19. #define ADC_NAME "my_adc"  
  20. #define SUCCESS 0  
  21.   
  22. static int adc_open(struct inode *,struct file *);  
  23. static int adc_release(struct inode *,struct file *);  
  24. static int __init adc_init(void);  
  25. static int __exit adc_exit(void);  
  26. static ssize_t adc_read(struct file *,char *,size_t,loff_t *);  
  27.   
  28. volatile unsigned long adc_con;  
  29. unsigned long adc_dat0;  
  30.   
  31. int flag;//等待任务完成标志  
  32.   
  33. unsigned long buf;//存放转换完成的数据  
  34.   
  35. //声明等待队列  
  36. DECLARE_WAIT_QUEUE_HEAD(adc_wait);  
  37.   
  38. struct clk *adc_clk;   
  39.   
  40.   
  41. static irqreturn_t adc_interrupt(int irq,void * dev_id)//中断处理程序  
  42. {  
  43.     if(flag==0)  
  44.     {  
  45.         buf=(readw(adc_dat0) & 0x3ff );//读取转换完成的数据  
  46.         flag=1;  
  47.         wake_up_interruptible(&adc_wait);//唤醒等待其上的进程  
  48.         printk("Read value is %ld\n",buf);  
  49.     }  
  50.     return IRQ_HANDLED;  
  51. }  
  52.   
  53. static struct file_operations  adc_ops =  
  54. {  
  55.     .owner  =   THIS_MODULE,  
  56.     .read       =   adc_read,  
  57.     .open   =   adc_open,  
  58.     .release    =   adc_release,  
  59. };  
  60. static struct miscdevice adc_misc =   
  61. {  
  62.     .name = ADC_NAME,  
  63.     .minor = ADC_MAJOR,  
  64.     .fops = &adc_ops,  
  65. };  
  66. static int __init adc_init(void)  
  67. {  
  68.     int ret;  
  69.     adc_clk = clk_get(NULL,"adc");//获取时钟  
  70.     clk_enable(adc_clk);//使能时钟  
  71.       
  72.     ret=misc_register(&adc_misc); //注册设备  
  73.     if(ret<0)  
  74.     {  
  75.         printk("register device fail\n");  
  76.         return ret;  
  77.     }  
  78.     adc_con=(unsigned long)ioremap(0x58000000,4);  
  79.     adc_dat0=(volatile unsigned long)ioremap(0x58000000+S3C2410_ADCDAT0,4);  
  80.     if( !(adc_con & adc_dat0) )  
  81.     {  
  82.         printk("Failed to ioremap\n");  
  83.         goto handle;  
  84.     }  
  85.     printk("Initialized...\n");  
  86.     return SUCCESS;  
  87. handle:  
  88.     misc_deregister(&adc_misc);  
  89.     return -1;  
  90. }  
  91.   
  92. static int adc_open(struct inode * inode,struct file * file) //打开设备函数  
  93. {  
  94.     //注册中断  
  95.     int ret;  
  96.     //disable_irq(IRQ_ADC);  
  97.     //enable_irq(IRQ_ADC);  
  98.     ret=request_irq(IRQ_ADC,adc_interrupt,IRQF_SHARED,ADC_NAME,1);//注册中断 IRQ_ADC在 mach/irqs.h中定义  
  99.     if(ret<0)  
  100.     {  
  101.         printk("IRQ %d can not request\n",IRQ_ADC);  
  102.         return ret;  
  103.     }  
  104.     return SUCCESS;  
  105. }  
  106.   
  107. static int adc_release(struct inode * inode,struct file * file) //关闭设备函数  
  108. {  
  109.     free_irq(IRQ_ADC,1);//释放中断  
  110.     return SUCCESS;  
  111. }  
  112.   
  113. static ssize_t adc_read(struct file *file,  
  114.                             char * buffer,  
  115.                             size_t length,  
  116.                             loff_t * offset)//设备读取函数  
  117. {  
  118.       
  119.     writew((1<<14)|(0x31<<6),adc_con);       //设置ADCCON  
  120.     writew((readw(adc_con) | 0x1),adc_con);  //启动AD转换  
  121.     wait_event_interruptible(adc_wait,flag);  
  122.     flag=0;  
  123. }  
  124.   
  125. static int __exit adc_exit(void) //驱动卸载函数  
  126. {  
  127.     iounmap(adc_con);  
  128.     iounmap(adc_dat0);  
  129.     misc_deregister(&adc_misc);  
  130.     clk_disable(adc_clk);  
  131.     clk_put(adc_clk);  
  132.     printk("The adc is unintialized\n");  
  133.     return SUCCESS;  
  134. }  
  135.   
  136. module_init(adc_init);           
  137. module_exit(adc_exit);  
  138. MODULE_LICENSE("GPL");  

关键字:ARM  Linux  自动创建  设备结点 引用地址:ARM-Linux自动创建设备结点

上一篇:ARM-Linux触摸屏驱动移植--问题总结
下一篇:ARM-Linux驱动--ADC驱动(中断方式)

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

非常实用的arm智能测温系统应用方案
  测温测量和控制在当今社会生活中扮演着至关重要的角色,国际国内市场现有的多种测温技术涵盖了安检、市 场、生活、消防、科研等诸多领域。温度的测量和控制在工 业生产中有广泛的应用,尤其在石油、化工、电力、冶金等 重要工业领域中,对温度的测量和监控是非常重要的一个环节。在传统的温度测量系统中,温度采集器通常采用模拟温 度传感器,模拟信号在传输的过程中容易受到干扰从而影响测量的准确度,模拟信号转化成数字信号,精度较高的A/D 转换器一般价格昂贵,对于传统系统存在的不足,结合国内外在温度监测系统上的研究现状,本文进行了新的设计。   本文智能测温系统基于物联网技术与嵌入式技术实现 远程无线可移动的视频监控系统,依托于FS_S5PC10
[单片机]
非常实用的<font color='red'>arm</font>智能测温系统应用方案
基于ARM的CAN总线智能节点的设计
CAN(Controller Area Network)即控制器局域网,CAN总线是国际上应用最广泛的现场总线之一。它最早是由德国Bosch公司推出的,CAN通信协议是一种用于汽车内部测量与执行部件之间的数据通信协议。 作为一种技术先进、可靠性高、功能完善、成本合理的远程网络通讯控制方式,CAN总线已被广泛应用于各个自动化控制系统中。例如,在汽车电子、自动控制、智能大厦、电子系统、安防监控等各领域中,CAN总线具有不可比拟的优越性。本设计给出CAN总线节点方案。它采用内置多路CAN总线控制器PLC2294作为主控制器,使得该节点体积小、功耗低、抗干扰性好,因而特别适用于汽车、工业控制以及医疗系统和容错维护总线中。 1 硬件
[网络通信]
三星获64位ARM晶片设计许可或开发伺服器晶片
    北京时间11月8日下午消息,据美国IT网站Computer World报导,三星已获得ARM首批64位处理器Cortex-A57和Cortex-A53的设计许可。分析师称,三星可能会从智能手机和平板电脑市场扩张到伺服器市场。 ARM目前的32位处理器应用范围一直未能突破嵌入式设备和移动设备。这批64位处理器效能比更高,速度更快,将用于伺服器、高端智能手机和平板电脑。预计首批采用64位ARM处理器的伺服器将于2014年面世。 三星发言人表示不方便谈论公司未来的晶片或伺服器计划。 Mercury Research首席分析师迪恩·麦克卡隆(Dean McCarron)说,如果三星决定开发伺服器晶片,其利润
[手机便携]
ARM总裁:微软在移动领域需要我们
ARM总裁都德·布朗(Tudor Brown)   新浪科技讯 北京时间1月7日上午消息,ARM总裁都德·布朗(Tudor Brown)周四表示,借助兼容ARM处理器的Windows操作系统,微软终将在移动互联网领域确立重要地位。   布朗称,尽管智能手机和平板电脑市场目前由苹果和谷歌占据主导,但微软现在进军这一市场还不算晚。   微软以往只针对英特尔占据主导的桌面市场开发操作系统,但此次兼容ARM处理器表明微软也将重点拓展移动市场。   “对微软而言,问题不在于是否(兼容ARM),而在于何时。现在终于发生了。我们一直都在引导并吸引微软从事这项工作。”布朗说。   “要在移动互联网领域有所建树,微软就需要AR
[手机便携]
<font color='red'>ARM</font>总裁:微软在移动领域需要我们
详解bootloader的执行流程与ARM Linux启动过程分析
ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。 1、引 言 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些
[单片机]
详解bootloader的执行流程与<font color='red'>ARM</font> <font color='red'>Linux</font>启动过程分析
Arm承认其Cortex M可被侧信道攻击但否认已被破解
Arm 上周五发表声明称,对其基于 TrustZone 的 Cortex-M 系统的成功侧信道攻击(side-channel attack)“并不意味着该架构提供的保护失败”。 “Armv8-M 架构的安全扩展并不意味着可以防止由于控制流或内存访问模式引起的侧信道攻击。实际上,此类攻击并非特定于 Armv8-M 架构;它们可能适用于任何代码,依赖于密码的控制流或内存访问模式。”Arm说道。 Arm 在上周的 Black Hat Asia infosec 会议上发表了一份声明——题为“把你的秘密交给我,MCU!对微控制器的微架构定时攻击是实用的”——声称该芯片设计公司的微控制器容易受到侧信道攻击。 基于 2018 年发现
[单片机]
ARM Linux从入口到Start_kernel代码分析 - (1)
以2.6.19内核为版本. 1. Boot loader在跳转到kernel之前,必须完成 (1). CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断都是禁止的; (2). MMU(内存管理单元)必须是关闭的, 此时虚拟地址对物理地址; (3). 数据cache(Data cache)必须是关闭的 (4). 指令cache(Instruction cache)可以是打开的,也可以是关闭的,这个没有强制要求; (5). CPU 通用寄存器0 (r0)必须是 0; (6). CPU 通用寄存器1 (r1)必须是 ARM Linux machine type (关于machine type
[单片机]
基于Keil MDK-ARM 和 IAR EWARM进行仿真打印的配置
1写在前面 很多初学者习惯使用软件仿真,应该是很多人都知道的一款仿真软件。 以前开发板相对较贵,且快递不方便,使用仿真软件可以理解。现在便宜的STM32开发板就十几块,还用仿真软件,我不是很理解。 有经验的人都知道,仿真和实际运行情况很多时候都不一样,相信不用我说,大家都明白。 因此,我个人不是很推荐大家仿真,本文内容可能存在纰漏,仅限个人学习。 下面讲述基于Keil MDK-ARM 和 IAR EWARM进行仿真打印的配置。 2Keil仿真打印配置 Keil MDK-ARM不能仿真,原因出在仿真参数出现了问题: 修改这两处参数为:DARMSTM.DLL -pSTM32F103ZE 基于前面使用STM32CubeMX生成工
[单片机]
基于Keil MDK-<font color='red'>ARM</font> 和 IAR EWARM进行仿真打印的配置
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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