|
@@ -0,0 +1,254 @@
|
|
|
+using __u32 = System.UInt32;
|
|
|
+using __s32 = System.Int32;
|
|
|
+using __u16 = System.UInt16;
|
|
|
+using System;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
+// ReSharper disable FieldCanBeMadeReadOnly.Local
|
|
|
+// ReSharper disable ArrangeTypeMemberModifiers
|
|
|
+// ReSharper disable BuiltInTypeReferenceStyle
|
|
|
+// ReSharper disable InconsistentNaming
|
|
|
+
|
|
|
+namespace Avalonia.LinuxFramebuffer
|
|
|
+{
|
|
|
+ unsafe class NativeUnsafeMethods
|
|
|
+ {
|
|
|
+ [DllImport("libc", EntryPoint = "open", SetLastError = true)]
|
|
|
+ public static extern int open(string pathname, int flags, int mode);
|
|
|
+
|
|
|
+ [DllImport("libc", EntryPoint = "close", SetLastError = true)]
|
|
|
+ public static extern int close(int fd);
|
|
|
+
|
|
|
+ [DllImport("libc", EntryPoint = "ioctl", SetLastError = true)]
|
|
|
+ public static extern int ioctl(int fd, FbIoCtl code, void* arg);
|
|
|
+
|
|
|
+ [DllImport("libc", EntryPoint = "mmap", SetLastError = true)]
|
|
|
+ public static extern IntPtr mmap(IntPtr addr, IntPtr length, int prot, int flags,
|
|
|
+ int fd, IntPtr offset);
|
|
|
+ [DllImport("libc", EntryPoint = "munmap", SetLastError = true)]
|
|
|
+ public static extern int munmap(IntPtr addr, IntPtr length);
|
|
|
+
|
|
|
+ [DllImport("libc", EntryPoint = "memcpy", SetLastError = true)]
|
|
|
+ public static extern int memcpy(IntPtr dest, IntPtr src, IntPtr length);
|
|
|
+
|
|
|
+ [DllImport("libc", EntryPoint = "select", SetLastError = true)]
|
|
|
+ public static extern int select(int nfds, void* rfds, void* wfds, void* exfds, IntPtr* timevals);
|
|
|
+
|
|
|
+ [DllImport("libevdev.so.2", EntryPoint = "libevdev_new_from_fd", SetLastError = true)]
|
|
|
+ public static extern int libevdev_new_from_fd(int fd, out IntPtr dev);
|
|
|
+
|
|
|
+ [DllImport("libevdev.so.2", EntryPoint = "libevdev_has_event_type", SetLastError = true)]
|
|
|
+ public static extern int libevdev_has_event_type(IntPtr dev, EvType type);
|
|
|
+
|
|
|
+ [DllImport("libevdev.so.2", EntryPoint = "libevdev_next_event", SetLastError = true)]
|
|
|
+ public static extern int libevdev_next_event(IntPtr dev, int flags, out input_event ev);
|
|
|
+
|
|
|
+ [DllImport("libevdev.so.2", EntryPoint = "libevdev_get_name", SetLastError = true)]
|
|
|
+ public static extern IntPtr libevdev_get_name(IntPtr dev);
|
|
|
+ [DllImport("libevdev.so.2", EntryPoint = "libevdev_get_abs_info", SetLastError = true)]
|
|
|
+ public static extern input_absinfo* libevdev_get_abs_info(IntPtr dev, int code);
|
|
|
+ }
|
|
|
+
|
|
|
+ enum FbIoCtl : uint
|
|
|
+ {
|
|
|
+ FBIOGET_VSCREENINFO = 0x4600,
|
|
|
+ FBIOPUT_VSCREENINFO = 0x4601,
|
|
|
+ FBIOGET_FSCREENINFO = 0x4602,
|
|
|
+ FBIOGET_VBLANK = 0x80204612u,
|
|
|
+ FBIO_WAITFORVSYNC = 0x40044620,
|
|
|
+ FBIOPAN_DISPLAY = 0x4606
|
|
|
+ }
|
|
|
+
|
|
|
+ [Flags]
|
|
|
+ enum VBlankFlags
|
|
|
+ {
|
|
|
+ FB_VBLANK_VBLANKING = 0x001 /* currently in a vertical blank */,
|
|
|
+ FB_VBLANK_HBLANKING = 0x002 /* currently in a horizontal blank */,
|
|
|
+ FB_VBLANK_HAVE_VBLANK = 0x004 /* vertical blanks can be detected */,
|
|
|
+ FB_VBLANK_HAVE_HBLANK = 0x008 /* horizontal blanks can be detected */,
|
|
|
+ FB_VBLANK_HAVE_COUNT = 0x010 /* global retrace counter is available */,
|
|
|
+ FB_VBLANK_HAVE_VCOUNT = 0x020 /* the vcount field is valid */,
|
|
|
+ FB_VBLANK_HAVE_HCOUNT = 0x040 /* the hcount field is valid */,
|
|
|
+ FB_VBLANK_VSYNCING = 0x080 /* currently in a vsync */,
|
|
|
+ FB_VBLANK_HAVE_VSYNC = 0x100 /* verical syncs can be detected */
|
|
|
+ }
|
|
|
+
|
|
|
+ unsafe struct fb_vblank {
|
|
|
+ public VBlankFlags flags; /* FB_VBLANK flags */
|
|
|
+ __u32 count; /* counter of retraces since boot */
|
|
|
+ __u32 vcount; /* current scanline position */
|
|
|
+ __u32 hcount; /* current scandot position */
|
|
|
+ fixed __u32 reserved[4]; /* reserved for future compatibility */
|
|
|
+ };
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ unsafe struct fb_fix_screeninfo
|
|
|
+ {
|
|
|
+ public fixed byte id[16]; /* identification string eg "TT Builtin" */
|
|
|
+
|
|
|
+ public IntPtr smem_start; /* Start of frame buffer mem */
|
|
|
+
|
|
|
+ /* (physical address) */
|
|
|
+ public __u32 smem_len; /* Length of frame buffer mem */
|
|
|
+
|
|
|
+ public __u32 type; /* see FB_TYPE_* */
|
|
|
+ public __u32 type_aux; /* Interleave for interleaved Planes */
|
|
|
+ public __u32 visual; /* see FB_VISUAL_* */
|
|
|
+ public __u16 xpanstep; /* zero if no hardware panning */
|
|
|
+ public __u16 ypanstep; /* zero if no hardware panning */
|
|
|
+ public __u16 ywrapstep; /* zero if no hardware ywrap */
|
|
|
+ public __u32 line_length; /* length of a line in bytes */
|
|
|
+
|
|
|
+ public IntPtr mmio_start; /* Start of Memory Mapped I/O */
|
|
|
+
|
|
|
+ /* (physical address) */
|
|
|
+ public __u32 mmio_len; /* Length of Memory Mapped I/O */
|
|
|
+
|
|
|
+ public __u32 accel; /* Type of acceleration available */
|
|
|
+ public fixed __u16 reserved[3]; /* Reserved for future compatibility */
|
|
|
+ };
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ struct fb_bitfield
|
|
|
+ {
|
|
|
+ public __u32 offset; /* beginning of bitfield */
|
|
|
+ public __u32 length; /* length of bitfield */
|
|
|
+
|
|
|
+ public __u32 msb_right; /* != 0 : Most significant bit is */
|
|
|
+ /* right */
|
|
|
+ };
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ unsafe struct fb_var_screeninfo
|
|
|
+ {
|
|
|
+ public __u32 xres; /* visible resolution */
|
|
|
+ public __u32 yres;
|
|
|
+ public __u32 xres_virtual; /* virtual resolution */
|
|
|
+ public __u32 yres_virtual;
|
|
|
+ public __u32 xoffset; /* offset from virtual to visible */
|
|
|
+ public __u32 yoffset; /* resolution */
|
|
|
+
|
|
|
+ public __u32 bits_per_pixel; /* guess what */
|
|
|
+ public __u32 grayscale; /* != 0 Graylevels instead of colors */
|
|
|
+
|
|
|
+ public fb_bitfield red; /* bitfield in fb mem if true color, */
|
|
|
+ public fb_bitfield green; /* else only length is significant */
|
|
|
+ public fb_bitfield blue;
|
|
|
+ public fb_bitfield transp; /* transparency */
|
|
|
+
|
|
|
+ public __u32 nonstd; /* != 0 Non standard pixel format */
|
|
|
+
|
|
|
+ public __u32 activate; /* see FB_ACTIVATE_* */
|
|
|
+
|
|
|
+ public __u32 height; /* height of picture in mm */
|
|
|
+ public __u32 width; /* width of picture in mm */
|
|
|
+
|
|
|
+ public __u32 accel_flags; /* acceleration flags (hints) */
|
|
|
+
|
|
|
+ /* Timing: All values in pixclocks, except pixclock (of course) */
|
|
|
+ public __u32 pixclock; /* pixel clock in ps (pico seconds) */
|
|
|
+
|
|
|
+ public __u32 left_margin; /* time from sync to picture */
|
|
|
+ public __u32 right_margin; /* time from picture to sync */
|
|
|
+ public __u32 upper_margin; /* time from sync to picture */
|
|
|
+ public __u32 lower_margin;
|
|
|
+ public __u32 hsync_len; /* length of horizontal sync */
|
|
|
+ public __u32 vsync_len; /* length of vertical sync */
|
|
|
+ public __u32 sync; /* see FB_SYNC_* */
|
|
|
+ public __u32 vmode; /* see FB_VMODE_* */
|
|
|
+ public fixed __u32 reserved[6]; /* Reserved for future compatibility */
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ enum EvType
|
|
|
+ {
|
|
|
+ EV_SYN = 0x00,
|
|
|
+ EV_KEY = 0x01,
|
|
|
+ EV_REL = 0x02,
|
|
|
+ EV_ABS = 0x03,
|
|
|
+ EV_MSC = 0x04,
|
|
|
+ EV_SW = 0x05,
|
|
|
+ EV_LED = 0x11,
|
|
|
+ EV_SND = 0x12,
|
|
|
+ EV_REP = 0x14,
|
|
|
+ EV_FF = 0x15,
|
|
|
+ EV_PWR = 0x16,
|
|
|
+ EV_FF_STATUS = 0x17,
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ struct input_event
|
|
|
+ {
|
|
|
+ private IntPtr crap1, crap2;
|
|
|
+ public ushort type, code;
|
|
|
+ public int value;
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ unsafe struct fd_set
|
|
|
+ {
|
|
|
+ public int count;
|
|
|
+ public fixed int fds [256];
|
|
|
+ }
|
|
|
+
|
|
|
+ enum AxisEventCode
|
|
|
+ {
|
|
|
+ REL_X = 0x00,
|
|
|
+ REL_Y = 0x01,
|
|
|
+ REL_Z = 0x02,
|
|
|
+ REL_RX = 0x03,
|
|
|
+ REL_RY = 0x04,
|
|
|
+ REL_RZ = 0x05,
|
|
|
+ REL_HWHEEL = 0x06,
|
|
|
+ REL_DIAL = 0x07,
|
|
|
+ REL_WHEEL = 0x08,
|
|
|
+ REL_MISC = 0x09,
|
|
|
+ REL_MAX = 0x0f
|
|
|
+ }
|
|
|
+
|
|
|
+ enum AbsAxis
|
|
|
+ {
|
|
|
+ ABS_X = 0x00,
|
|
|
+ ABS_Y = 0x01,
|
|
|
+ ABS_Z = 0x02,
|
|
|
+ ABS_RX = 0x03,
|
|
|
+ ABS_RY = 0x04,
|
|
|
+ ABS_RZ = 0x05,
|
|
|
+ ABS_THROTTLE = 0x06,
|
|
|
+ ABS_RUDDER = 0x07,
|
|
|
+ ABS_WHEEL = 0x08,
|
|
|
+ ABS_GAS = 0x09,
|
|
|
+ ABS_BRAKE = 0x0a,
|
|
|
+ ABS_HAT0X = 0x10,
|
|
|
+ ABS_HAT0Y = 0x11,
|
|
|
+ ABS_HAT1X = 0x12,
|
|
|
+ ABS_HAT1Y = 0x13,
|
|
|
+ ABS_HAT2X = 0x14,
|
|
|
+ ABS_HAT2Y = 0x15,
|
|
|
+ ABS_HAT3X = 0x16,
|
|
|
+ ABS_HAT3Y = 0x17,
|
|
|
+ ABS_PRESSURE = 0x18,
|
|
|
+ ABS_DISTANCE = 0x19,
|
|
|
+ ABS_TILT_X = 0x1a,
|
|
|
+ ABS_TILT_Y = 0x1b,
|
|
|
+ ABS_TOOL_WIDTH = 0x1c
|
|
|
+ }
|
|
|
+
|
|
|
+ enum EvKey
|
|
|
+ {
|
|
|
+ BTN_LEFT = 0x110,
|
|
|
+ BTN_RIGHT = 0x111,
|
|
|
+ BTN_MIDDLE = 0x112
|
|
|
+ }
|
|
|
+
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ struct input_absinfo
|
|
|
+ {
|
|
|
+ public __s32 value;
|
|
|
+ public __s32 minimum;
|
|
|
+ public __s32 maximum;
|
|
|
+ public __s32 fuzz;
|
|
|
+ public __s32 flat;
|
|
|
+ public __s32 resolution;
|
|
|
+
|
|
|
+ }
|
|
|
+}
|