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