创建3个节点。sys下面和proc、dev下面。
sys下节点的产生。
/*访问设置属性方法*/
static ssize_t led_val_show(struct device* dev, struct device_attribute* attr, char* buf);
static ssize_t led_val_store(struct device* dev, struct device_attribute* attr, const char* buf, size_t count);
/*定义设备属性*/
static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, led_val_show, led_val_store);
其中sys下节点是个二进制文件,可以直接读写。其会有内核调用 show和store、DEVICE_ATTR是定义给个device_attribute的变量。其变量名字为dev_attr_##val(##为替换)。本例中定义了dev-attr_val变量。
之后调用class_creat device_creat device_creat_file 产生属性文件。属性文件名字为val。
led_class = class_create(THIS_MODULE, DEVICE_NAME);
temp = device_create(led_class, NULL, dev, "%s",DEVICE_NAME); //dev为设备号
err = device_create_file(temp, &dev_attr_val);
产生了sys就产生了dev下节点。。。同时在show和store中可以实现读写操作要实现的功能。
proc目录的产生。
/*创建/proc/led文件*/
static void led_create_proc(void) {
struct proc_dir_entry* entry;
entry = create_proc_entry(DEVICE_NAME, 0, NULL);
if(entry) {
// entry->owner = THIS_MODULE;
entry->read_proc = led_proc_read;
entry->write_proc = led_proc_write;
}
}
以上函数在模块卸载时对应的remove函数为
device_destroy(led_class, MKDEV(led_major, led_minor));
class_destroy(led_class);
remove_proc_entry(DEVICE_NAME, NULL);
http://download.csdn.net/detail/kuangrenyu/4175427
以上内容个人总结。如有不对。欢迎指正
***********************************************************************************************************
下边把灯点到android上吧
************************************************************************************************************
如果把这一层简单的看作hal层。那么可以简单的写个JNI层
int fd;
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
*/
void Java_com_ledCtr_LedCtr_setOn( JNIEnv* env,
jobject thiz )
{
add code
}
void Java_com_ledCtr_LedCtr_setOff( JNIEnv* env,
jobject thiz )
{
add code
}
void Java_com_ledCtr_LedCtr_ledInit( JNIEnv* env,
jobject thiz )
{
fd = open("/dev/leds", O_RDONLY);
if (fd < 0)
{
return 1;
}
return 0;
}
JNI命名规则 Java_包名_类名_函数名()
这就意味着在应用程序中首先要创建一个包名和类名 他们名字和JNI定义的一样。这个类有点类似与server类,这个类中声明一下这个函数。然后在我的主程序中就可以实现这个类的实体。并通过这个实体调用下层函数。
public class LedCtr {
static{
System.load("/system/lib/libled-jni.so");//加载JNI库,可以通过JNI接口调用JNI中提供的方法
}
public LedCtr() {
Log.i("LedService", "Go to get LED Stub...");
ledInit();
}
/*
* Mokoid LED native methods.
*/
public void ledOn() { //service层方法的实现
Log.i("MokoidPlatform", "LED On");
setOn(); //调用JNI层的本地方法
}
public void ledOff() {
Log.i("MokoidPlatform", "LED Off");
setOff();
}
private static native void ledInit(); //声明本地方法
private static native void setOn();
private static native void setOff();
}
******************************************************************************************************
上面一种方法比较简单。但是不是现在android的框架结构。可以作为对hal层的测试使用
*******************************************************************************************************