一、实验平台:开发板fs2410,采用三星s3c2410的CPU,linux操作系统。
二、实现功能:主程序打印提示信息(当然可以做你想做的事),用定时器0产生中断,是LED灯D12闪烁。
三、实验原理:
这里采用平台设备驱动机制,将硬件资源与驱动分开,提高了代码的可移植性。
四、实验现象:
应用程序执行后,主程序在终端打印信息,D12在闪烁。

五、实验总结:
使用平台设备驱动机制,整个驱动程序分成了几个部分,本例中是timer0_dev.c和timer0_drv.c
六、示例代码:
驱动部分:
/*timer0_dev.c*/
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/device.h>
#include<linux/fs.h>
#include<linux/platform_device.h>
#include <asm/mach/map.h>
static struct resource timer0_resource[] = {
[0] = {
.start = S3C24XX_PA_TIMER,
.end = S3C24XX_PA_TIMER + 0xff,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_TIMER0,
.end = IRQ_TIMER0,
.flags = IORESOURCE_IRQ,
}
};
void timer0_release(struct device * dev)
{
}
struct platform_device timer0_device = {
.name = "timer0",
.id = -1,
.num_resources = ARRAY_SIZE(timer0_resource),
.resource = timer0_resource,
.dev ={
.release =timer0_release,
},
};
int __init timer0_dev_init(void)
{
platform_device_register(&timer0_device);
return 0;
}
void __exit timer0_dev_exit(void)
{
platform_device_unregister(&timer0_device);
}
module_init(timer0_dev_init);
module_exit(timer0_dev_exit);
MODULE_LICENSE("GPL");
/*timer0_drv.c*/
#include<linux/kernel.h>
#include<linux/device.h>
#include<linux/fs.h>
#include<linux/init.h>
#include<asm/io.h>
#include<asm/irq.h>
#include<asm/uaccess.h>
#include<linux/interrupt.h>
#include<asm/arch/regs-gpio.h>
#include<asm/arch/leds-gpio.h>
#include<linux/platform_device.h>
int count = 0;
static unsigned int timer0_major = 0;
static struct class *timer0_class = NULL;
struct resource *res;
struct s3c2410_timer{
volatile unsigned long tcfg0;
volatile unsigned long tcfg1;
volatile unsigned long tcon;
volatile unsigned long tcntb0;
volatile unsigned long tcmpb0;
};
struct s3c2410_timer *timer0;
static irqreturn_t timer0_irq(int irq, void *dev_id)
{
if(count%2 == 0)
s3c2410_gpio_setpin(S3C2410_GPF4, 0);
else
s3c2410_gpio_setpin(S3C2410_GPF4, 1);
count++;
return IRQ_HANDLED;
}
static int timer0_open(struct inode *inode, struct file *file)
{
int ret;
s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
s3c2410_gpio_setpin(S3C2410_GPF4, 1);
timer0->tcfg0 = 249; //预分频器
timer0->tcfg1 = 2; //多路开关设为1/8
timer0->tcntb0 = 12500; //输出方波的周期为1s
timer0->tcon |= 0xb;
timer0->tcon &= ~(1<<1);
ret = request_irq(res->start, timer0_irq, 0, "timer0", "a");
return 0;
}
static int timer0_close(struct inode *inode, struct file *file)
{
free_irq(res->start, "a");
return 0;
}
struct file_operations timer0_fops = {
.owner = THIS_MODULE,
.open = timer0_open,
.release = timer0_close,
};
static int __devinit timer0_probe(struct platform_device *pdev)
{
/*获得I/O资源*/
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
/*映射*/
timer0 = (struct s3c2410_timer *)ioremap(res->start, res->end-res->start+1);
/*获得中断资源*/
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
/*注册*/
timer0_major = register_chrdev(0, "timer0", &timer0_fops);
timer0_class = class_create(THIS_MODULE, "timer0_class");
class_device_create(timer0_class, NULL, MKDEV(timer0_major,0), NULL, "timer0");
return 0;
}
static int __devexit timer0_remove(struct platform_device *pdev)
{
unregister_chrdev(timer0_major, "timer0");
class_destroy(timer0_class);
class_device_destroy(timer0_class, MKDEV(timer0_major,0));
iounmap(timer0);
return 0;
}
struct platform_driver timer0_driver = {
.probe = timer0_probe,
.remove = timer0_remove,
.driver = {
.owner = THIS_MODULE,
.name = "timer0",
},
};
int __init timer0_init(void)
{
platform_driver_register(&timer0_driver);
return 0;
}
void __exit timer0_exit(void)
{
platform_driver_unregister(&timer0_driver);
}
module_init(timer0_init);
module_exit(timer0_exit);
MODULE_LICENSE("GPL");/*测试代码timer0_test.c*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void)
{
int fd;
if((fd = open("/dev/timer0",O_RDWR)) == -1){
perror("open /dev/timer0 failed");
exit(-1);
}
while(1){
printf("main process...\n");
sleep(1);
}
return 0;
}
本文介绍了基于三星s3c2410 CPU的开发板上,如何在Linux操作系统下利用定时器0产生中断,实现LED灯闪烁的功能。实验通过平台设备驱动机制,将硬件资源与驱动分离,提高代码可移植性。程序执行后,终端显示信息且LED灯D12闪烁。驱动程序分为timer0_dev.c和timer0_drv.c两个部分。
6330

被折叠的 条评论
为什么被折叠?



