linux 433送信ドライバ

3906 ワード

ドライバコード:
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
//#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>

#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>

#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-k.h>
#define DEVICE_NAME "433"

static long t433_ioctl(struct file *filp, unsigned int cmd, unsigned int arg)
{
 	unsigned tmp, h, l, i, j, cmd1;
	
	tmp = readl(S3C64XX_GPKDAT);
	h = tmp |(0x01<<8);//  8    GBK8  1
      l = tmp &(~(0x01<<8));//  8    GBK8  0
	for(j=0; j<5; j++){
		cmd1=cmd;
		writel(h, S3C64XX_GPKDAT);//      
		mdelay(3);				  //3ms
		writel(l, S3C64XX_GPKDAT);//       
		mdelay(2);			  //800us
		for(i=0; i<32; i++){
			if(cmd1&0x1){// 1
				//printk("1");
				writel(h, S3C64XX_GPKDAT);//    
				mdelay(2);				  //2ms
				writel(l, S3C64XX_GPKDAT);//       
				mdelay(2);			  //800us
			}
			else {// 0
				//printk("0");
				writel(h, S3C64XX_GPKDAT);//    
				mdelay(1);				  //1ms
				writel(l, S3C64XX_GPKDAT);//       
				mdelay(2);			  //800us
			}
			cmd1=cmd1>>1;   //  
		}
		msleep(8);
	//printk("

"); } //printk("t433_ioctl
"); //printk("cmd=%d
arg=%d
",cmd,arg); return 0; } static struct file_operations dev_fops = { .owner = THIS_MODULE, .unlocked_ioctl = t433_ioctl, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; { unsigned tmp; tmp = readl(S3C64XX_GPKCON1); tmp = (tmp & ~0xf)|(0x01); // GBK8 writel(tmp, S3C64XX_GPKCON1); tmp = readl(S3C64XX_GPKDAT); // tmp |= (0x01<<8);// 8 GBK8 1 tmp &= ~(0x01<<8);// 8 GBK8 1 //tmp &= 0x0; writel(tmp, S3C64XX_GPKDAT); } ret = misc_register(&misc);// /dev DEVICE_NAME printk ("size unsigned = %d
", sizeof(unsigned)); printk (DEVICE_NAME"\tinitialized
"); return ret; } static void __exit dev_exit(void) { misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("yangkun");

以上のドライバは、自分のプロトコルに従って送信されます.いくつかのタイミングです
テストコード:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
	int on;
	int led_no;
	int fd;

	if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
			on < 0 || on > 1 || led_no < 0 || led_no > 3) {
		fprintf(stderr, "Usage: leds led_no 0|1
"); exit(1); } fd = open("/dev/433", 0); if (fd < 0) { fd = open("/dev/433", 0); } if (fd < 0) { perror("open device leds"); exit(1); } //char a[4]={0xc0, 0x00, 0x11, 0xee}; //memcpy(&on, a, 4); if(on==1) on=0xee1101c0; else on=0xee1100c0; printf("on=%x
",on); ioctl(fd, on, led_no); close(fd); return 0; }

コードはフレンドリーに変更されました.