历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2019年02月15日 | ARM开发之杂项设备的编写----以LED驱动为例

2019-02-15 来源:eefocus

平台:S5PV210


杂项设备的好处:


有了字符型设备后,为什么要用杂项设备?


1.节省主设备号,所有杂项设备的主设备号都是10


2.杂项设备开发起来比字符型设备简单




开发步骤:


1.定义1个杂项设备


2.定义杂项设备的文件操作集


3.申请物理内存区


4.获取相应的虚拟地址


5.注册混杂设备


6.示例代码




1.定义杂项设备



static struct miscdevice led_misc = {

.minor = MISC_DYNAMIC_MINOR, 

.name = "misc_led",

.fops = &fops,

};

如上代码:其中.minor代表动态生成次设备号,不用改。

.name表示这个混杂设备文件结点的名字,用户程序用open在 /dev 目录下打开文件的就是 .name 的值。


.fops代表杂项设备的文件操作集




2.定义文件操作集


static struct file_operations fops =

{

.owner = THIS_MODULE,

.open = misc_open,

        .write = misc_write,

};

文件操作集表示了杂项设备用了哪些系统调用,如上代码就是用了 open 和 write。

第一个参数不用变,.owner一定写THIS_MODULE,用于初始化。




3.申请物理内存区


static struct resource *res = NULL;

res = request_mem_region(0xE0200280,8,"LED");

上面表示,控制LED的物理地址为0XE0200280开始,8个字节,并把这段内存起名为LED



4.获取相应虚拟地址。


操作系统操作的都是虚拟地址。


static unsigned int va = NULL;

va = ioremap(0xE02000A0,8);

va就是物理地址映射的虚拟地址的起始地址。



5.注册杂项设备


int ret;

ret = misc_register(&led_misc);

if(ret < 0)

{

printk("misc register is error\n");

return -1;

}

misc_register()的参数就是第一步定义的杂项设备变量。




6.示例代码(LED驱动)


#include

#include

#include

#include

#include

#include

#include

#include

#include

 

static struct resource* res = NULL;

static unsigned int *GPJ2CON_VA = NULL;

static unsigned int *GPJ2DAT_VA = NULL;

static char wbuf[1];

 

static ssize_t misc_write(struct file *f, const char __user*buf,

size_t len, loff_t *t)

{

copy_from_user(wbuf,buf,len);

if(wbuf[0] == '0')

{

*GPJ2DAT_VA &=~0xf;

}

 

if(wbuf[0] == '1')

{

*GPJ2DAT_VA &=~0xf;

*GPJ2DAT_VA |=0xf;

}

return 0;

}

 

/*2.定义文件操作集*/

static struct file_operations fops={

.owner = THIS_MODULE,

.write = misc_write,

};

 

/*1.定义misc杂项设备变量*/

static struct miscdevice misc_led={

.minor = MISC_DYNAMIC_MINOR,

.name = "led_misc",

.fops = &fops,

};

 

static int __init misc_init(void)

{

int ret;

/*3.申请物理内存*/

res = request_mem_region(0xe0200280,8,"LED");

if(res == NULL)

{

printk("failed to request_mem_region\n");

goto failed_request_mem;

}

 

/*4.获取虚拟地址*/

GPJ2CON_VA = ioremap(0xe0200280,8);

if(GPJ2CON_VA == NULL)

{

printk("failed to ioremap\n");

goto failed_ioremap;

}

GPJ2DAT_VA = GPJ2CON_VA + 1;

 

/*5注册杂项设备*/

ret = misc_register(&misc_led);

if(ret<0)

{

printk("failed to register misc\n");

goto failed_register;

}

printk("init completed\n");

return 0;

 

failed_register:

iounmap(GPJ2CON_VA);

failed_ioremap:

release_mem_region(0xe0200280,8);

failed_request_mem:

return -1;

}

 

static void __exit misc_exit(void)

{

iounmap(GPJ2CON_VA);

release_mem_region(0xe0200280,8);

misc_deregister(&misc_led);

}

 

module_init(misc_init);

module_exit(misc_exit);

MODULE_LICENSE("GPL");


用户程序测试代码:

#include

#include

 

int main()

{

char buf[1];

buf[0]='0';

 

int fd = open("/dev/led_misc",O_WRONLY);

if(fd<0)

{

perror("failed to open");

return -1;

}

while(1)

{

write(fd,buf,1);

sleep(1);

buf[0] = '1';

write(fd,buf,1);

sleep(1);

buf[0] = '0';

}

return 0;

}

推荐阅读

史海拾趣

Connor-Winfield公司的发展小趣事

随着全球经济的一体化,电子行业也逐渐呈现出全球化的趋势。Connor-Winfield敏锐地把握住了这一机遇,开始实施全球化战略。公司积极拓展海外市场,与多家国际知名企业建立了紧密的合作伙伴关系。这些合作不仅为公司带来了更多的商业机会,也使其在全球化竞争中保持了领先地位。

Fabrimex AG公司的发展小趣事

1979年,Fabrimex AG接管了ARCO-Solar(美国)的代表处,标志着公司正式进入光伏领域。这一举措为公司带来了新的增长点,并推动了相关产品的研发和生产。随着光伏技术的不断发展,Fabrimex AG在光伏领域逐渐取得了显著的成绩,为公司带来了可观的收益。

BRIGHT公司的发展小趣事

随着BRIGHT公司在国际市场上的不断拓展,其品牌和产品也引起了一定的争议。在一些国家和地区,BRIGHT公司的某些行为或言论引发了公众的不满和批评。然而,这并没有阻挡BRIGHT公司前进的步伐。他们坚持自己的发展策略,通过不断创新和改进产品,积极应对各种挑战和机遇。在国际市场上,BRIGHT公司逐渐树立起了自己的品牌形象,并为电子行业的发展做出了重要的贡献。

这些故事展示了BRIGHT公司在电子行业中的不同领域所取得的成就和发展。无论是无线耳机领域的开创者、太阳能领域的突破者,还是健康技术领域的创新者、酒店业务的拓展者,以及在国际市场上的拓展与争议,都体现了BRIGHT公司不断创新、追求卓越的精神。这些故事不仅反映了BRIGHT公司的发展历程,也展示了电子行业的多样性和活力。

HiRel Connectors Inc公司的发展小趣事
避免频繁开关摄像头和电源设备以减少对电路的冲击和损耗。
Compostar Technology Co Ltd公司的发展小趣事

品质是公司发展的基石。Compostar Technology Co Ltd始终坚持严格的品质管理,从原材料采购到生产过程的每一个环节都进行严格的把控。同时,公司还注重品牌建设,通过统一的品牌形象和宣传策略,不断提升品牌知名度和美誉度。这些举措使得公司在激烈的市场竞争中始终保持领先地位。

Frolyt Condensers & Elements GmbH公司的发展小趣事

面对电子行业日益增长的定制化需求,Frolyt Condensers & Elements GmbH积极调整策略,提供从设计咨询到产品生产的全方位定制化服务。公司建立了一支专业的技术团队,能够根据客户的具体需求,快速响应并设计出符合要求的电容器产品。这种高度定制化的服务模式赢得了众多客户的信赖和好评,使得Frolyt在竞争激烈的市场中脱颖而出。

问答坊 | AI 解惑

51端口内幕

,51系列单片机在应用到IIC接口时,数据线上要注意串一…

查看全部问答>

惠普 4416s(WP439PA) 怎么样

屏幕尺寸:14.1英寸 重量:2.27Kg 处理器:AMD 炫龙 II M340 主板芯片组:AMD RX881 显卡:ATI HD 4330 光驱类型:DVD刻录机 内存大小:2GB 硬盘大小:320GB 用途 单片机开发 程序开发…

查看全部问答>

什么错误能导致设备完全死机?

我有一台wince5.0的设备,装上调试版运行一程序,正常情况下,按键等操作都会在超级终端上打印出信息;我做了一些操作后(会频繁读写SD卡的操作),按键消息都打印不出来了。。。。那是驱动打印出来的,是不是驱动异常了?但超级终端上也没有异常信息 ...…

查看全部问答>

DSP2407中A0~A15和D0~D15怎么使用?

不扩展存储器时怎么做IO口用?只要能控制某个脚的高低就行…

查看全部问答>

汽车LED照明方案设计

发光二极管(LED)照明为标新立异、舒适和用户定制开启了一片新天地。这些设计机遇在迅速提升LED在车内的应用程度和速度。当把LED用在车内、车前和车尾照明时,有几种方法和设计技术可供选择。   对车用LED来说,其相对抗振、寿命长、高能效及 ...…

查看全部问答>

STM32GPIO问题

想模拟IIC SDA脚有输入也会有输出的时候,STM32管脚方式有八种, 该配置成什么方式呢?…

查看全部问答>

判断

刚买了一个单片机,为啥一通电8*8点阵就亮了,没输入任何的程序,求高手指教,是坏了吗…

查看全部问答>

超声波测水位

各位高手,这是我写的用超声波水位的程序,这是我根据别人的程序修改的。现在是没啥反应。没啥显示的。我用的是两位的数码管。麻烦指点一下! /***************************************************************************** * 晶   ...…

查看全部问答>

LM4F

开始上LM4F,求中文手册,本人E文烂的要命,实在看不了E文资料,那位朋友手头有中文资料的,求顺手发份,谢谢…

查看全部问答>

晒几张常用的老伙计的内部照片,,哈哈,,

干这行最核心的就是使用测试机了。先放一张我见过比较牛逼的测试机镇楼--安捷伦93k(1024 channel),开开眼,据说intel的cpu也是有用这个平台测试的。某司的费用是100$/hour。不过还没那么幸运能玩弄这个东西,too 贵(当然还有一些其他niubil ...…

查看全部问答>