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();

                 }

              }

           }

           });

     }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,689评论 0 3
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,392评论 2 45
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一天下来感觉好忙碌,李宇轩有点感冒不舒服,今天考试的成绩也很不理想,考的特别差,错了一个大题,今晚上给他出了两道类...
    AASu素阅读 80评论 0 0
  • 步骤/方法:1、怀孕期间出现睡觉不踏实或者多梦现象的,首先建议去医院做下孕检,确保胎儿正常,没有其他特殊的病症,一...
    喻莉阅读 206评论 0 0