一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

led燈驅(qū)動(dòng)測(cè)試

 jianbin226 2012-06-12
led驅(qū)動(dòng)程序:
#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參數(shù)指定內(nèi)核源碼的目錄,這樣make時(shí)會(huì)進(jìn)入到內(nèi)核源碼目錄,M=$PWD或SUBDIRS=$PWD,指定要編譯的模塊所在目錄,make modules時(shí),內(nèi)核主makefile會(huì)執(zhí)行此目錄下的Makefile,編譯模塊*/
//SUBDIRS 也可以用M代替
clean:
 -rm -f led.mod.c modules.order Module.symvers
 -rm -f *~ core *.o *.ko
生成.ko文件后下載到開(kāi)發(fā)板/usr/led,加載insmod led.ko 。在/dev/下創(chuàng)建設(shè)備(有的會(huì)自動(dòng)創(chuàng)建)mknod led c 212 0。
(查資料:如果在程序中添加函數(shù)class_create和device_create(分別創(chuàng)建類和節(jié)點(diǎn)),就能夠在/dev目錄下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn))
通過(guò)cat /proc/devices查看掛載有沒(méi)有成功。
 
測(cè)試文件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。產(chǎn)生led_test文件。
下載到/usr/led/test/目錄下,改變文件的執(zhí)行權(quán)限:chmod +x led_test。
執(zhí)行:./led_test   
OK,燈亮
 
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    高清欧美大片免费在线观看| 欧美午夜一级特黄大片| 狠狠亚洲丁香综合久久| 国产精品免费不卡视频| 亚洲最新一区二区三区| 免费在线播放一区二区| 日韩精品一区二区毛片| 久久精品福利在线观看| 色婷婷日本视频在线观看| 大香蕉伊人一区二区三区| 日韩不卡一区二区三区色图| 一区二区三区在线不卡免费| 91精品国产综合久久不卡| 99久久国产精品成人观看| 国内欲色一区二区三区| 欧美一区二区在线日韩| 一区二区三区在线不卡免费| 亚洲一区二区三区一区| 日本特黄特色大片免费观看| 黄色av尤物白丝在线播放网址 | 亚洲性生活一区二区三区| 亚洲一区二区精品免费视频| 精品欧美日韩一二三区| 日本淫片一区二区三区| 国产女同精品一区二区| 中文字幕日韩欧美理伦片| 亚洲国产av在线视频| 日本加勒比系列在线播放| 午夜精品一区二区av| 黄色片一区二区在线观看| 亚洲一区二区三区熟女少妇| 色好吊视频这里只有精| 国产超薄黑色肉色丝袜| 国产性情片一区二区三区| 久久国产人妻一区二区免费| 四季av一区二区播放| 国产一二三区不卡视频| 欧美精品一区久久精品| 我想看亚洲一级黄色录像| 手机在线不卡国产视频| 欧美乱视频一区二区三区|