转载:kernel与用户层接口之proc接口 例子

 转载: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 }  

猜你喜欢

转载自www.cnblogs.com/zys-simon/p/9196697.html