打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
led灯驱动测试
led驱动程序:
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/device.h>
#include<linux/types.h>
#include<linux/ioctl.h>
#include<linux/errno.h>
#include<linux/init.h>
#include<linux/cdev.h>
#include<asm/uaccess.h>
#include<linux/fs.h>
#include<asm/io.h>
#include<mach/regs-gpio.h>

#define DEVICE_NAME "led"
#define DEVICE_MAJOR 212
static int led_major=DEVICE_MAJOR;

#define LED1 S3C2410_GPB5
#define LED1_OUTP S3C2410_GPB5_OUTP

#define LED_ON 0
#define LED_OFF 1

struct s3c2410_led_dev
{
 struct cdev cdev;
 int status;
};

static struct s3c2410_led_dev dev;

void s3c2410_led_InitIO(void);

void s3c2410_led_InitIO(void)
{
  s3c2410_gpio_cfgpin(LED1,LED1_OUTP);
  s3c2410_gpio_setpin(LED1,LED_OFF);
}

static int s3c2410_led_open(struct inode *inode,struct file *filp)
{
 return 0;
}

static int s3c2410_led_release(struct inode *inode,struct file *filp)
{
 return 0;
}

static int s3c2410_led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd ,unsigned long arg)
{
 switch (cmd)
 {
  case LED_ON:
   s3c2410_gpio_setpin(LED1,LED_ON);
   dev.status=1;
   break;
  case LED_OFF:
   s3c2410_gpio_setpin(LED1,LED_OFF);
   dev.status=0;
   break;
  default:
   return -EINVAL;
 }
 return 0;
}

static ssize_t s3c2410_led_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
 put_user(dev.status,(int *)buffer);
 return 1;
}

static ssize_t s3c2410_led_write(struct file *filp,char *buffer, size_t count,loff_t *ppos)
{
 get_user(dev.status,(int *)buffer);
 if(dev.status==0)
  s3c2410_gpio_setpin(LED1,LED_OFF);
 else if(dev.status==1)
  s3c2410_gpio_setpin(LED1,LED_ON);
 return 1;
}

static struct file_operations s3c2410_led_fops={
 .owner =THIS_MODULE,
 .open =s3c2410_led_open,
 .release=s3c2410_led_release,
 .ioctl =s3c2410_led_ioctl,
 .read =s3c2410_led_read,
 .write =s3c2410_led_write,
};

static void led_setup_cdev(void)
{
 int err,devno=MKDEV(led_major,0);
 cdev_init(&dev.cdev,&s3c2410_led_fops);
 dev.cdev.owner=THIS_MODULE;
 dev.cdev.ops=&s3c2410_led_fops;
 err=cdev_add(&dev.cdev,devno,1);
 if(err)
 printk("Error %d adding LED %d",err);
}

static int s3c2410_led_init(void)
{
 int result;
 dev_t devno=MKDEV(led_major,0);
 if(led_major)
 result=register_chrdev_region(devno,1,DEVICE_NAME);
 else
 {
  result=alloc_chrdev_region(&devno,0,1,DEVICE_NAME);
  led_major=MAJOR(devno);
 }
 if(result<0)
  return result;
 led_setup_cdev();
 s3c2410_led_InitIO();
 dev.status=0;
 printk(DEVICE_NAME"initialized\n");
 return 0;
}

static void s3c2410_led_exit(void)
{
 cdev_del(&dev.cdev);
 unregister_chrdev_region(MKDEV(led_major,0),1);
}


module_init(s3c2410_led_init);
module_exit(s3c2410_led_exit);
MODULE_LICENSE("GPL");
Makefile文件:
obj-m:=led.o
KDIR:=/opt/EmbedSky/linux-2.6.30.4
PWD:=$(shell pwd)
default:
 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules/*先用-C参数指定内核源码的目录,这样make时会进入到内核源码目录,M=$PWD或SUBDIRS=$PWD,指定要编译的模块所在目录,make modules时,内核主makefile会执行此目录下的Makefile,编译模块*/
//SUBDIRS 也可以用M代替
clean:
 -rm -f led.mod.c modules.order Module.symvers
 -rm -f *~ core *.o *.ko
生成.ko文件后下载到开发板/usr/led,加载insmod led.ko 。在/dev/下创建设备(有的会自动创建)mknod led c 212 0。
(查资料:如果在程序中添加函数class_create和device_create(分别创建类和节点),就能够在/dev目录下自动创建设备节点)
通过cat /proc/devices查看挂载有没有成功。
 
测试文件led_test.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include"sys/types.h"
#include"sys/ioctl.h"
#include"stdlib.h"
#include"termios.h"
#include"sys/stat.h"
#include"fcntl.h"
#include"sys/time.h"
#define LED_ON 0
#define LED_OFF 1
int main()
{
 int fd,i,j;
 int led_status=0;
 fd=open("/dev/led",O_RDWR);
 if(fd<0)
 {
  perror("open device led failed!");
  exit(1);
 }
 printf("led test show.press ctrl +c exit /n");
 ioctl(fd,LED_OFF);
 
 while(1)
 { 
  read(fd,&led_status,1);
  if(led_status==0)
   ioctl(fd,LED_ON);
  else if(led_status==1)
   ioctl(fd,LED_OFF);
  printf("led:on and off\n");
  for(i=0;i<300;i++)
  for(j=0;j<10000;j++);
 }
 close(fd);
 return 0;
}
编译arm-linux-gcc -o led_test led_test.c。产生led_test文件。
下载到/usr/led/test/目录下,改变文件的执行权限:chmod +x led_test。
执行:./led_test   
OK,灯亮
 
 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux下AM335X的GPIO控制
LED驱动(原创)
通过一个LED驱动程序开始学写Linux字符设备驱动
转:Linux I2C 驱动分析
手把手带你写一个中断输入设备驱动
devfs_mk_cdev 与devfs_register引用 ARM嵌入式LINUX设备驱动设计入 - 嵌入式驱动开发 - wuyunzdh
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服