Android 如何利用proc有上层想kernel写文件

有时候我们需要不经过Android的上层代码调用kernel的标准的机制,往往为了,一步到位的话就可以采用proc的机制,就是在kernel里面创建一个设备节点,然后android的上层代码,可以通过读写文件的方式,来有上层直接到kernel来达到我们想要的目的。

先讲上层的代码:

可以在Android的代码里面,可以在应用代码里面 应用架构里面 或HAL层应该都可以吧,不过我的是在应用层里面,是jiava代码里面。

/**wangyulu **/
import android.os.SystemProperties;
import android.util.Log;
import android.widget.Toast; //wang
import java.util.Timer;
import java.util.TimerTask;
import android.os.PowerManager;
import java.io.*;
import android.os.Looper;

上面是java需要代码需要的库

if (true) log("updateScreen()...");
         if (true) log("/*************************wangyulu updateScreen Phone ***************************/ ");
         File awakeTimeFile = new File("proc/sound8976/sound8976_galley_select");
         FileWriter fr;
         try

{
              fr = new FileWriter(awakeTimeFile);
              fr.write("1");
             if (true) log("/*************************wangyulu updateScreen write success ***************************/ ");
              fr.close();
         }

catch (IOException e)

{

e.printStackTrace();
          }

上面是java的写文件代码,是向/proc/sound8976/sound8976_galley_select 写1   直接就可以调用kernel里面的proc的写函数,留意下面的写函数。

if (!mIsForegroundActivity) { //wang add
            if (DBG) log("onPhoneStateChanged: Activity not in foreground! Bailing out...");
   if (DBG) log("onPhoneStateChanged: Activity not in foreground! Bailing out...");
            /*************wangyulu add down************/
      File awakeTimeFile = new File("proc/sound8976/sound8976_galley_select");
            FileWriter fr;
            try {
   
              fr = new FileWriter(awakeTimeFile);
              fr.write("0");
             if (true) log("/*************************wangyulu updateScreen write success ***************************/ ");
              fr.close();
            } catch (IOException e) {
             e.printStackTrace();
            }
            return;
        }

上面是java的写文件代码,是向/proc/sound8976/sound8976_galley_select 写0  直接就可以调用kernel里面的proc的写函数,留意下面的写函数。

其实还有读文件的函数,我在这里就不列举了。

下层代码:

这个主要是kernel里面的代码:

/*********wangyulu add down******/
extern char g_selected_codec[];
if(!strcmp(g_selected_codec, "wm8976")){
#define MODEM_SWITCH_PROC_NAME "sound8976_galley_select"
#define PROC_NAME "sound8976"
extern struct proc_dir_entry proc_root;
struct proc_dir_entry *root_entry;
struct proc_dir_entry *entry;

root_entry = proc_mkdir(PROC_NAME, &proc_root);
s_proc = create_proc_entry(MODEM_SWITCH_PROC_NAME, 0666, root_entry);
if (s_proc != NULL){
s_proc->write_proc = modem_switch_writeproc;
s_proc->read_proc = modem_switch_readproc;
}
}
printk(KERN_INFO "Initializing wm8976_modinit...\n");
/********wangyulu add up********/

上面是在kernel里面建立文件的节点/proc/sound8976/sound8976_galley_select

/**************wangyulu add down********/
/********* creat mode8976 in proc ******/
int sound8976_galley_select_flag = 0;
static struct proc_dir_entry * s_proc = NULL;
static int modem_switch_writeproc(struct file *file,const char *buffer,
                           unsigned long count, void *data)
{
       int value;
      value = 0;
     sscanf(buffer, "%d", &value);
    switch(value)
    {
         case 0:
         wm8976_set_register_sound(value);
         break;
         case 1:
          wm8976_set_register_sound(value);
         break;
         default:
         printk("************************wangyulu sound8976_galley_select_flag ==null***********************\n");
         break;
       }
       return count;
 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdzjd.html