114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
/* File: libfdt.i */
 | 
						|
%module libfdt
 | 
						|
 | 
						|
%{
 | 
						|
#define SWIG_FILE_WITH_INIT
 | 
						|
#include "libfdt.h"
 | 
						|
%}
 | 
						|
 | 
						|
%pythoncode %{
 | 
						|
def Raise(errnum):
 | 
						|
    raise ValueError('Error %s' % fdt_strerror(errnum))
 | 
						|
 | 
						|
def Name(fdt, offset):
 | 
						|
    name, len = fdt_get_name(fdt, offset)
 | 
						|
    return name
 | 
						|
 | 
						|
def String(fdt, offset):
 | 
						|
    offset = fdt32_to_cpu(offset)
 | 
						|
    name = fdt_string(fdt, offset)
 | 
						|
    return name
 | 
						|
 | 
						|
def swap32(x):
 | 
						|
    return (((x << 24) & 0xFF000000) |
 | 
						|
            ((x <<  8) & 0x00FF0000) |
 | 
						|
            ((x >>  8) & 0x0000FF00) |
 | 
						|
            ((x >> 24) & 0x000000FF))
 | 
						|
 | 
						|
def fdt32_to_cpu(x):
 | 
						|
    return swap32(x)
 | 
						|
 | 
						|
def Data(prop):
 | 
						|
    set_prop(prop)
 | 
						|
    return get_prop_data()
 | 
						|
%}
 | 
						|
 | 
						|
%include "typemaps.i"
 | 
						|
%include "cstring.i"
 | 
						|
 | 
						|
%typemap(in) void* = char*;
 | 
						|
 | 
						|
typedef int fdt32_t;
 | 
						|
 | 
						|
struct fdt_property {
 | 
						|
        fdt32_t tag;
 | 
						|
        fdt32_t len;
 | 
						|
        fdt32_t nameoff;
 | 
						|
        char data[0];
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * This is a work-around since I'm not sure of a better way to copy out the
 | 
						|
 * contents of a string. This is used in dtoc/GetProps(). The intent is to
 | 
						|
 * pass in a pointer to a property and access the data field at the end of
 | 
						|
 * it. Ideally the Data() function above would be able to do this directly,
 | 
						|
 * but I'm not sure how to do that.
 | 
						|
 */
 | 
						|
#pragma SWIG nowarn=454
 | 
						|
%inline %{
 | 
						|
    static struct fdt_property *cur_prop;
 | 
						|
 | 
						|
    void set_prop(struct fdt_property *prop) {
 | 
						|
        cur_prop = prop;
 | 
						|
    }
 | 
						|
%}
 | 
						|
 | 
						|
%cstring_output_allocate_size(char **s, int *sz, free(*$1));
 | 
						|
%inline %{
 | 
						|
    void get_prop_data(char **s, int *sz) {
 | 
						|
        *sz = fdt32_to_cpu(cur_prop->len);
 | 
						|
        *s = (char *)malloc(*sz);
 | 
						|
        if (!*s)
 | 
						|
            *sz = 0;
 | 
						|
        else
 | 
						|
            memcpy(*s, cur_prop + 1, *sz);
 | 
						|
    }
 | 
						|
%}
 | 
						|
 | 
						|
%typemap(in) (const void *) {
 | 
						|
  if (!PyByteArray_Check($input)) {
 | 
						|
    SWIG_exception_fail(SWIG_TypeError, "in method '" "$symname" "', argument "
 | 
						|
                       "$argnum"" of type '" "$type""'");
 | 
						|
  }
 | 
						|
  $1 = (void *) PyByteArray_AsString($input);
 | 
						|
}
 | 
						|
 | 
						|
const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
 | 
						|
int fdt_path_offset(const void *fdt, const char *path);
 | 
						|
int fdt_first_property_offset(const void *fdt, int nodeoffset);
 | 
						|
int fdt_next_property_offset(const void *fdt, int offset);
 | 
						|
const char *fdt_strerror(int errval);
 | 
						|
const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
 | 
						|
                                                      int offset,
 | 
						|
                                                      int *OUTPUT);
 | 
						|
const char *fdt_get_name(const void *fdt, int nodeoffset, int *OUTPUT);
 | 
						|
const char *fdt_string(const void *fdt, int stroffset);
 | 
						|
int fdt_first_subnode(const void *fdt, int offset);
 | 
						|
int fdt_next_subnode(const void *fdt, int offset);
 | 
						|
 | 
						|
%typemap(in) (void *) {
 | 
						|
  if (!PyByteArray_Check($input)) {
 | 
						|
    SWIG_exception_fail(SWIG_TypeError, "in method '" "$symname" "', argument "
 | 
						|
                       "$argnum"" of type '" "$type""'");
 | 
						|
  }
 | 
						|
  $1 = PyByteArray_AsString($input);
 | 
						|
}
 | 
						|
 | 
						|
int fdt_delprop(void *fdt, int nodeoffset, const char *name);
 | 
						|
 | 
						|
const char *fdt_strerror(int errval);
 | 
						|
int fdt_pack(void *fdt);
 | 
						|
 | 
						|
int fdt_totalsize(const void *fdt);
 | 
						|
int fdt_off_dt_struct(const void *fdt);
 |