完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
代码为根26位的代码发送,实际参考项目验证通过,部分没有经过验证可实际调试的过程,实际调试过程中是否有问题,如果有问题,已按顺序排列,26位已按顺序排列,使用线程进行调试。
#include 《dt-bindings/gpio/gpio.h》 #include 《linux/gpio.h》 #include 《linux/of_gpio.h》 #include 《linux/module.h》 #include 《linux /kernel.h》 #include 《linux/init.h》 #include 《linux/platform_device.h》 #include 《linux/fb.h》 #include 《linux/backlight.h》 #include 《linux/err.h》 #include 《linux/pwm.h》 #include 《linux/pwm_backlight.h》 #include 《linux/slab.h》 #include 《linux/proc_fs.h》 #include 《linux/termios.h》 #include 《linux/互斥量.h》 #include 《 linux/workqueue.h》 #include 《linux/delay.h》 #include 《linux/irq.h》 #include 《linux/interrupt.h》 //#define INVALID_GPIO -1 #define uchar unsigned char #define USE_INT struct proc_dir_entry *gpio_extend_dir; 静态结构类 *rk_gpio_class = NULL; void Send_Wiegand26(unsigned char *str); 静态 int Wiegand26_IntToChar(int data); extern void rk_send_power_key(int state); 外部无效rk_send_wakeup_key(无效); 静态int gpio2_a0; 静态int gpio2_a1; 静态int gl_value = 0; 静态 int irq_gpio2_a0; 静态 int irq_gpio2_a1; 静态int偶数=0; 静态int奇数=0; struct Wiegand26{ 布尔标志; 字符数据[24]; }; 结构 Wiegand26 wiegand26; 静态字符 tmp[28]; 静态字符 send_tmp[30]; 静态 int irq_count = 0; 静态结构 of_device_id gpio_of_match[] = { { .compatible = “gpio_ctrl” }, { } }; 静态无效WG_send_bit_0(无效); 静态无效WG_send_bit_1(无效); MODULE_DEVICE_TABLE(of, gpio_of_match); static ssize_t gpio_write_proc_string(struct file *file, const char __user *buffer, size_t count, loff_t *pos) { char *buf; 字符 buf2[11] = {0}; //int i = 0; 诠释; 如果(计数 《 1) 返回 -EINVAL; buf = kmalloc(计数,GFP_KERNEL); 如果(!buf) 返回-ENOMEM; if (copy_from_user(buf, buffer, count)) { kfree(buf); 返回-EFAULT; } printk(“gpio_write_proc_string gpio buf = %sn”, buf); strncpy(buf2, buf, ((count 》 sizeof(buf2)) ? sizeof(buf2) : count)); buf2[10] = ‘ ’; printk(“buf2 = %sn”, buf2); kfree(buf); 返回计数; } static int gpio_str_proc_show(struct seq_file *m, void *v) { printk(“gpio_str_proc_show somethingn”); 返回0; } static int gpio_str_proc_open(struct inode *inode, 返回 single_open(文件,gpio_str_proc_show,NULL); } static int gpio_str_proc_read(struct file *file, char *buffer, size_t count, loff_t *pos) { if (count 《 1) return -EINVAL; printk(“tmp = %sn”, tmp); if (copy_to_user(buffer, tmp, count)) { //gpio_unlock(&gpio_lock); 返回-EFAULT; } //gpio_unlock(&gpio_lock); 返回 1; } static const struct file_operations gpio_extend_fops = { .owner = THIS_MODULE, .open = gpio_str_proc_open, .read = gpio_str_proc_read, .llseek = seq_lseek, .release = single_release, .write = gpio_write_proc_string, }; static ssize_t switch_show(struct class *cls,struct class_attribute *attr, char *_buf) { printk(“%s》》》》》》》》n”,__func__); ssize_t len = 0; 整数值 = 0; 值 = gl_value; len += snprintf(_buf + len, PAGE_SIZE - len, “%d rn”, value); 返回 len; } static ssize_t switch_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count) { gl_value = simple_strtol(buf,NULL,10); printk(KERN_INFO “gl_value is %dn”,gl_value); gpio_direction_input(gpio2_a0); gpio_direction_input(gpio2_a1); enable_irq(irq_gpio2_a0); enable_irq(irq_gpio2_a1); } else if( gl_value == 0) { printk(KERN_INFO “gl_value is %dn”,gl_value); disable_irq(irq_gpio2_a0); disable_irq(irq_gpio2_a1); gpio_direction_output(gpio2_a0, 1); gpio_direction_output(gpio2_a1, 1); } 返回 _count; } //0010 0100 0111 0011 0011 1100 static ssize_t send_show(struct class *cls,struct class_attribute *attr, char *_buf) { printk(“%s》》》》》》》》n”,__func__); ssize_t len = 0; 整数值 = 0; 值 = gl_value; len += snprintf(_buf + len, PAGE_SIZE - len, “%d rn”, value); 返回 len; } static ssize_t send_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count) { int value; printk(“hxl buf = %sn”, buf); 如果(gl_value) 返回_count; strcpy(send_tmp,buf); printk(“hxl send_tmp = %sn”, send_tmp); 值 = simple_strtol(buf,NULL,10); // sscanf(buf, “%d”, &value); printk(“send_store ============= %xn”,value); Wiegand26_IntToChar(值); Send_Wiegand26(wiegand26.data); 返回_count; } 静态 CLASS_ATTR(switch, 0664, switch_show, switch_store); 静态 CLASS_ATTR(发送,0664,send_show,send_store); 静态 int gpio_sys_init(void) { int ret ; rk_gpio_class = class_create(THIS_MODULE, “wg_switch”); ret = class_create_file(rk_gpio_class, &class_attr_switch); if (ret) { printk(“创建 gpio5c1 类失败。n”); } ret = class_create_file(rk_gpio_class, &class_attr_send); if (ret) { printk(“创建 gpio5c3 类失败。n”); } 返回 0; } static void WG_send_bit_1(void) { //WG_DATA1 = 0; gpio_direction_output(gpio2_a1, 0); //--------------------- 大约1_100us //delay1_100us(); 乌德莱(100); //WG_DATA1 = 1; gpio_direction_output(gpio2_a1, 1); //--------------------------- 发送一个周期//延迟----发送一个周期 //1500us(); 乌德莱(1500); } static void WG_send_bit_0(void) { //WG_DATA0 = 0; gpio_direction_output(gpio2_a0, 0); //--------------------- udelay(100us u); //delay_100us(); //WG_DATA0 = 1; gpio_direction_output(gpio2_a0, 1); //--------------------------- 发送一个周期//延迟----发送一个周期 //1500us(); 乌德莱(1500); } 静态 int Wiegand26_IntToChar(int data) { int i = 0; 奇数 = 0; 偶数 = 0; for(i = 0; i 《 24; i++) { if(send_tmp ==‘1’) { wiegand26.data = ‘1’; if(i 《 12) 偶数 ++; 别的 odd ++; } else wiegand26.data = ‘0’; } printk(“in str %s n”, wiegand26.data); printk(“check even=%d,odd=%d n”,even,odd); return 0; } void gpio_reset(void) { gpio_direction_output(gpio2_a0,1); gpio_direction_output(gpio2_a1,1); } void Output_DATA0(void) { gpio_direction_output(gpio2_a0, 0); udelay(400); gpio_direction_output(gpio2_a0, 1); } void Output_DATA1(void) { gpio_direction_output(gpio2_a1, 0); udelay(400); gpio_direction_output(gpio2_a1, 1); } void Send_Wiegand26(unsigned char *str) { unsigned char one_num = 0; int i =0; printk(“nSend_Wiegand26 start n”); // WG_DATA0 = 1; // WG_DATA1 = 1; printk(“hxl ===even % 2 = %dn”,even % 2); gpio_reset(); udelay(2000); if(even % 2) { // WG_DATA1 = 0; /*偶校验位为1*/ // Delay_50us(8); // WG_DATA1 = 1; printk(“1”); Output_DATA1(); } else { // WG_DATA0 = 0; /*偶校验位为0*/ // Delay_50us(8); // WG_DATA0 = 1; Output_DATA0(); printk(“0”); } udelay(2000);/*延时2ms*/ for(i = 0;i 《 24;i++) { // WG_DATA0 = 1; // WG_DATA1 = 1; if(str & 0x01) { // WG_DATA1 = 0; // Delay_50us(8); // WG_DATA1 = 1; printk(“1”); Output_DATA1(); } else { // WG_DATA0 = 0; // Delay_50us(8); // WG_DATA0 = 1; printk(“0”); Output_DATA0(); } // (*(long*)&str[0]) 《《= 1; udelay(2000);/*延时2ms*/ } // WG_DATA0 = 1; // WG_DATA1 = 1; if(odd % 2) { // WG_DATA0 = 0; // Delay_50us(8); // WG_DATA0 = 1; printk(“0”); Output_DATA0(); } else { // WG_DATA1 = 0; // Delay_50us(8); // WG_DATA1 = 1; printk(“1”); Output_DATA1(); } udelay(2000); printk(“n Send_Weigand26 end n”); } static irqreturn_t weigen_read1(int irq, void *dev_id) { //printk(“0 n”); tmp[irq_count] = ‘0’; irq_count++; if (irq_count 》 25) { irq_count = 0; } return IRQ_HANDLED; } static irqreturn_t weigen_read2(int irq, void *dev_id) { tmp[irq_count] = ‘1’; irq_count++; if (irq_count 》 25) { irq_count = 0; } return IRQ_HANDLED; } static int gpio_control_probe(struct platform_device *pdev) { struct device_node *node = pdev-》dev.of_node; struct device *dev = &pdev-》dev; enum of_gpio_flags flags; int ret,error; int en_value; struct proc_dir_entry *ent; printk(“hxl func: %sn”, __func__); if (!node) return -ENODEV; printk(“gpio_control_prob hxl #####n”); gpio2_a0 = of_get_named_gpio_flags(node, “gpio_control_1”, 0, &flags); en_value = (flags == GPIO_ACTIVE_HIGH)? 1:0; //gpio = of_get_named_gpio(node, “gpios”, 0); if(!gpio_is_valid(gpio2_a0)){ dev_err(&pdev-》dev, “invalid gpio_control gpio%dn”, gpio2_a0); } printk(“gpio_request hxl ####n”); ret = devm_gpio_request(&pdev-》dev, gpio2_a0, “gpio1”); if (ret) { dev_err(&pdev-》dev, “failed to request GPIO%d for otg_drvn”, gpio2_a0); return -EINVAL; } printk(“set gpio direction_output hxl ###”); //gpio_direction_output(gpio2_a0, en_value); gpio_direction_input(gpio2_a0); #ifdef USE_INT irq_gpio2_a0 = gpio_to_irq(gpio2_a0); if (irq_gpio2_a0 《 0) { printk(“gpio-keys: Unable to get irq number for GPIO %dn”, gpio2_a0); gpio_free(gpio2_a0); //goto fail1; } error = devm_request_irq(dev, irq_gpio2_a0, weigen_read1, IRQF_TRIGGER_FALLING, “gpio2_a0”, NULL); if (error) { pr_err(“gpio-keys: Unable to irq_gpio2_a0 irq %d; error %dn”, irq_gpio2_a0, error); gpio_free(gpio2_a0); } disable_irq(irq_gpio2_a0); #endif gpio2_a1 = of_get_named_gpio_flags(node, “gpio_control_2”, 0, &flags); en_value = (flags == GPIO_ACTIVE_HIGH)? 1:0; //gpio = of_get_named_gpio(node, “gpios”, 0); if(!gpio_is_valid(gpio2_a1)){ dev_err(&pdev-》dev, “invalid gpio_control gpio%dn”, gpio2_a1); } |
|
|
|
ret = devm_gpio_request(&pdev-》dev, gpio2_a1, “gpio2”);
if (ret) { dev_err(&pdev-》dev, “failed to request GPIO%d for otg_drvn”, gpio2_a1); return -EINVAL; } printk(“set gpio direction_output hxl ###”); //gpio_direction_output(gpio2_a1, en_value); gpio_direction_input(gpio2_a1); //#if 0 #ifdef USE_INT irq_gpio2_a1 = gpio_to_irq(gpio2_a1); if (irq_gpio2_a1 《 0) { printk(“gpio-keys: Unable to get irq number for GPIO %dn”, gpio2_a1); gpio_free(gpio2_a1); //goto fail1; } #if 0 error = devm_request_threaded_irq(dev, irq, NULL,weigen_read2, IRQF_TRIGGER_RISING | IRQF_ONESHOT, “gpio2_a1”, NULL); #else error = devm_request_irq(dev, irq_gpio2_a1, weigen_read2, IRQF_TRIGGER_FALLING, “gpio2_a1”, NULL); #endif if (error) { pr_err(“gpio-keys: Unable to irq_gpio2_a1 irq %d; error %dn”, irq_gpio2_a1, error); gpio_free(gpio2_a1); //goto fail1; } disable_irq(irq_gpio2_a1); #endif gpio_direction_output(gpio2_a0, 1); gpio_direction_output(gpio2_a1, 1); gpio_extend_dir = proc_mkdir(“gpio_extend”, NULL); if(gpio_extend_dir == NULL) { printk(“unable to creat /proc/gpio_extend directoryn”); return -ENOMEM; } ent = proc_create(“gpio_str”, 0666, gpio_extend_dir, &gpio_extend_fops); if(ent == NULL) { printk(“unable to create /proc/gpio_extend/gpio_str entry”); //goto fail; } gpio_sys_init(); return 0; file: printk(“func: %s some errorn”, __func__); return 0; } static int gpio_control_remove(struct platform_device *pdev) { //printk(“func: %sn”, __func__); return 0; } #ifdef CONFIG_PM_SLEEP static int gpio_control_suspend(struct device *dev) { //printk(“func: %sn”, __func__); return 0; } static int gpio_control_resume(struct device *dev) { //printk(“func: %sn”, __func__); return 0; } #endif static const struct dev_pm_ops gpio_control_ops = { #ifdef CONFIG_PM_SLEEP .suspend = gpio_control_suspend, .resume = gpio_control_resume, .poweroff = gpio_control_suspend, .restore = gpio_control_resume, #endif }; 静态结构 platform_driver gpio_driver = { .driver = { .name = “gpio_control”, .owner = THIS_MODULE, .pm = &gpio_control_ops, .of_match_table = of_match_ptr(gpio_of_match), }, .probe = gpio_control_probe, .remove = gpio_control_remove, }; module_platform_driver(gpio_driver); MODULE_DESCRIPTION(“gpio_control”); MODULE_LICENSE(“GPL”); MODULE_ALIAS(“平台:gpio_control”); |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【飞凌嵌入式OK3576-C开发板体验】SSH远程登录网络配置及CAN通讯
638 浏览 0 评论
2065 浏览 3 评论
rk1126实现BT601输入,输入不带IIC接口的驱动程序
3894 浏览 0 评论
2405 浏览 1 评论
3642 浏览 3 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-3 02:15 , Processed in 1.055180 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号