转载:https://blog.csdn.net/zbunix/article/details/8833419
一个简单的例子
1 #include <linux/module.h> 2 #include <linux/kernel.h> 3 #include <linux/proc_fs.h> 4 #include <linux/string.h> 5 #include <linux/uaccess.h> //copy_from_user 6 7 #define ENTRYNAME "n802" 8 static struct proc_dir_entry *proc_entry; 9 static char pin_name[32] = {0}; 10 static char pin_pull[32] = {0}; 11 12 /* 13 get pin level: 14 echo "g12 up" > /proc/n802 15 cat /proc/n802 16 */ 17 static int n802_read( char *page, char **start, off_t off, int count, int *eof, void *data ) 18 { 19 int i; 20 char buf[64] = {0}; 21 int len = 0; 22 int pin_level = 0; 23 int gpio_index = -1; 24 unsigned int pin_pull_val = GPIO_PULL_DISABLE; 25 26 gpio_index = find_mygpio(pin_name); 27 if ( -1 == gpio_index ) { 28 printk("Error: no found gpio(%s)\n", pin_name); 29 goto end_n802_read; 30 } 31 32 if ( NULL != strstr(pin_pull,"up") ) 33 pin_pull_val = GPIO_PULLUP; 34 35 if ( NULL != strstr(pin_pull,"down") ) 36 pin_pull_val = GPIO_PULLDOWN; 37 38 gpio_request(gpio_index,pin_name); 39 tcc_gpio_config(gpio_index, GPIO_FN(0)|pin_pull_val); 40 tcc_gpio_direction_input(gpio_index); 41 42 msleep(20); 43 pin_level = gpio_get_value(gpio_index); 44 sprintf(buf, "%s %d", pin_name, pin_level ); 45 len = strlen(buf); 46 47 strcpy( page, (char*)buf); 48 49 printk("%s: pin_name=%s(%d) pin_level=%d\n", __FUNCTION__, pin_name, gpio_index,pin_level); 50 51 if (D>0){ 52 printk("%s:\n", __FUNCTION__ ); 53 for (i=0;i<len;i++) 54 printk("%02x ", buf[i] ); 55 printk("\n"); 56 printk("%s\n", buf); 57 } 58 59 end_n802_read: 60 return len; 61 } 62 63 /* 64 set pin level: 65 echo "g12 disable 1" > /proc/n802 66 echo "g12 up 1" > /proc/n802 67 echo "g12 down 1" > /proc/n802 68 */ 69 static int n802_write( struct file *filp, const char __user *buff, unsigned long len, void *data ) 70 { 71 int i; 72 char *p = NULL; 73 char *p1 = NULL; 74 int pin_level = 0; 75 int is_set_pin_level = 0; 76 int gpio_index = -1; 77 char buf[64] = {0}; 78 unsigned int pin_pull_val = GPIO_PULL_DISABLE; 79 80 memset( buf, 0, sizeof(buf) ); 81 if (copy_from_user( buf, buff, len )) { 82 return -EFAULT; 83 } 84 85 if (D>0){ 86 printk("%s: len=%d\n", __FUNCTION__, (int)len); 87 for (i=0;i<10;i++) 88 printk("%02x ", buf[i] ); 89 printk("\n"); 90 printk("%s\n", buf); 91 } 92 93 memset( pin_name, 0, sizeof(pin_name) ); 94 memset( pin_pull, 0, sizeof(pin_pull) ); 95 96 p1 = buf; 97 if ( NULL != (p = strchr(p1, ' ')) ) { 98 *p = 0; 99 strcpy(pin_name, p1); 100 101 p++; 102 p1 = p; 103 if ( NULL != (p = strchr(p1, ' ')) ) { 104 *p = 0; 105 strcpy(pin_pull, p1); 106 p++; 107 pin_level = simple_strtoul(p, NULL, 0); 108 is_set_pin_level = 1; 109 }else{ 110 strcpy(pin_pull, p1); 111 if ( NULL != (p = strchr(pin_pull, '\n'))) 112 *p = 0; 113 } 114 } 115 116 if ( NULL != strstr(pin_pull,"up") ) 117 pin_pull_val = GPIO_PULLUP; 118 119 if ( NULL != strstr(pin_pull,"down") ) 120 pin_pull_val = GPIO_PULLDOWN; 121 122 gpio_index = find_mygpio(pin_name); 123 if ( -1 == gpio_index ) { 124 printk("Error: no found gpio(%s)\n", pin_name); 125 goto end_n802_write; 126 } 127 128 if (is_set_pin_level ) { 129 printk("set pin_name=%s(%d) pin_pull=%s pin_level=%d\n", pin_name, gpio_index, pin_pull, pin_level); 130 gpio_request(gpio_index,pin_name); 131 tcc_gpio_config(gpio_index, GPIO_FN(0)|pin_pull_val); 132 gpio_direction_output(gpio_index,1); 133 gpio_set_value(gpio_index,pin_level); 134 }else{ 135 printk("get pin_name=%s(%d) pin_pull=%s\n", pin_name, gpio_index, pin_pull); 136 } 137 end_n802_write: 138 return len; 139 } 140 141 static int __init n802_init(void) 142 { 143 printk("%s\n", __FUNCTION__); 144 145 proc_entry = create_proc_entry( ENTRYNAME, 0666, NULL ); 146 if (proc_entry == NULL) { 147 printk(KERN_INFO "%s: Couldn't create proc entry\n", __FUNCTION__ ); 148 return -ENOMEM; 149 } 150 proc_entry->write_proc = n802_write; 151 proc_entry->read_proc = n802_read; 152 153 }