Android如何利用proc由上层向kernel写文件

Android 如何利用proc由上层向kernel写文件时候我们需要不经过Android的上层代码调用kernel的标准的机制,往往为了一步到位的话就可以采用proc的机制,就是在kernel里面创建一个设备节点,

然后android的上层代码,可以通过读写文件的方式,来由上层直接到kernel来达到我们想要的目的。

先讲上层的代码:

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

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("/*************************lu updateScreen Phone ***************************/ ");

File awakeTimeFile = new File("proc/sound8976/sound8976_galley_select");

FileWriter fr;

try{

   fr = new FileWriter(awakeTimeFile);

   fr.write("1");

   if (true) log("/************************* 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...");

   /*************lu add down************/

   File awakeTimeFile = new File("proc/sound8976/sound8976_galley_select");

   FileWriter fr;

   try {

      fr = new FileWriter(awakeTimeFile);

      fr.write("0");

      if (true) log("/*************************ulu updateScreen write success ***************************/ ");

      fr.close();

   } catch (IOException e) {

      e.printStackTrace();

   }

   return;

}

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

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

下层代码:

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

/*********lu add down******/

extern char g_selected_codec[];

if(!strcmp(g_selected_codec, "wm8976")){

#defineMODEM_SWITCH_PROC_NAME"sound8976_galley_select"

#definePROC_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");

/********lu add up********/

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

/**************lu 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("************************luu sound8976_galley_select_flag ==null***********************\n");

          break;

       }

       return count;

}

上面是proc的写函数,主要是响应java的写文件函数。

static int modem_switch_readproc(char *page, char **start, off_t off,int count, int *eof, void *data)

{

   int len;

   len = sprintf(page, "%d\n", sound8976_galley_select_flag==0?0:(sound8976_galley_select_flag==1?1:(sound8976_galley_select_flag==2?2:3))); //wangyulu

   if (off + count >= len)

     *eof = 1;

   if (len < off)

     return 0;

  *start = page + off;

  return ((count < len - off) ? count : len - off);

}

经过上面的操作,想看看写的是否正确 就可以在终端用 下满的指令,就知道文件里面是0 或是 1了。

/ # cat /proc/sound8976/sound8976_galley_select

0

其实这个方法还是不错的,希望对用android的朋友有帮助,如果有事吗疑问可以可我的博客留言,我们一起探讨,权当抛砖引玉,谢谢

Android上层怎样读写proc节点(示例)

import android.app.Activity;

import android.os.Bundle;

import android.widget.CompoundButton;

import android.widget.CompoundButton.OnCheckedChangeListener;

import android.widget.ToggleButton;

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;

public class DebugOptionActivity extends Activity{

   private static final String TAG = "tpDebug";

   private int checkValue = 0;


   @Override

   public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.debug);

      ToggleButton toggle = (ToggleButton)findViewById(R.id.toggle);

      try{

          File readFile = new File("proc/tp_debug/debug_switch");

          FileReader inCmd = new FileReader(readFile);

          try{

              checkValue = inCmd.read();

              if(checkValue != 0){

                 toggle.setChecked(true);

                } else{

                  toggle.setChecked(false);

                }

             }catch (IOException e){

               e.printStackTrace();

             }

           } catch (FileNotFoundException e){

             e.printStackTrace();

           }


           //ToggleButton toggle = (ToggleButton)findViewById(R.id.toggle);

           toggle.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            public void onCheckedChanged(CompoundButton arg0, boolean arg1){

             if (arg1) {

                 //open

                 File awakeTimeFile = new File("proc/tp_debug/debug_switch");

                 FileWriter fr;

                 try {

                   fr = new FileWriter(awakeTimeFile);

                   fr.write("1");

                   fr.close();

                 }catch (IOException e) {

                   e.printStackTrace();

                 }

              }else{

                 //close

                 File awakeTimeFile = new File("proc/tp_debug/debug_switch");

                 FileWriter fr;

                 try{

                    fr = new FileWriter(awakeTimeFile);

                    fr.write("0");

                    fr.close();

                 } catch (IOException e) {

                    e.printStackTrace();

                 }

              }

           }

           });

     }

}

你可能感兴趣的:(Android如何利用proc由上层向kernel写文件)