linux 433发送驱动

来源:互联网 发布:套号学历知乎 编辑:程序博客网 时间:2024/06/05 06:13

驱动代码:

#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输出0for(j=0; j<5; j++){cmd1=cmd;writel(h, S3C64XX_GPKDAT);//高电平起始位mdelay(3);  //3mswritel(l, S3C64XX_GPKDAT);//低电平数据间隔mdelay(2);  //800usfor(i=0; i<32; i++){if(cmd1&0x1){//写1//printk("1");writel(h, S3C64XX_GPKDAT);//写高电平mdelay(2);  //2mswritel(l, S3C64XX_GPKDAT);//低电平数据间隔mdelay(2);  //800us}else {//写0//printk("0");writel(h, S3C64XX_GPKDAT);//写高电平mdelay(1);  //1mswritel(l, S3C64XX_GPKDAT);//低电平数据间隔mdelay(2);  //800us}cmd1=cmd1>>1;   //右移}msleep(8);//printk("\n\n");}//printk("t433_ioctl\n");//printk("cmd=%d\narg=%d\n",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输出1tmp &= ~(0x01<<8);//把第8位也就是GBK8输出1//tmp &= 0x0;writel(tmp, S3C64XX_GPKDAT);}ret = misc_register(&misc);//应该是在/dev下出那个DEVICE_NAMEprintk ("size unsigned = %d\n", sizeof(unsigned));printk (DEVICE_NAME"\tinitialized\n");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\n");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;elseon=0xee1100c0;printf("on=%x\n",on);ioctl(fd, on, led_no);close(fd);return 0;}

代码是根据友善的改的。

原创粉丝点击