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;
}
コードはフレンドリーに変更されました.