Linux下share memory的访问方法
前一段时间公司的项目需要我来完成一个简单的API通过访问share memory的方法来控制硬件设备,现把代码共享出来一起学习:
/*
*************************************************************
* This is for swithc on/off asus A8E notebook touchpad
* Before using this program the SHMconfig option need
* to on for accessing the share memory,else my program
* won't work!
* Author : Stephen Du
* Date : 07-11-8
*************************************************************
*/
#include
#include
#include
#include
#include
#include
#include
#define SHMEM_SYNAP 23947
using namespace std;
typedef enum {
RT_TAP = 0, /* Right top corner */
RB_TAP, /* Right bottom corner */
LT_TAP, /* Left top corner */
LB_TAP, /* Left bottom corner */
F1_TAP, /* Non-corner tap, one finger */
F2_TAP, /* Non-corner tap, two fingers */
F3_TAP, /* Non-corner tap, three fingers */
MAX_TAP
} TapEvent;
struct SynapticsHwInfo
{
unsigned int model_id; /* Model-ID */
unsigned int capabilities; /* Capabilities */
unsigned int ext_cap; /* Extended Capabilities */
unsigned int identity; /* Identification */
int hasGuest; /* Has a guest mouse */
};
struct cSynapSHMem{
int version; /* Driver version */
/* Current device state */
int x, y; /* actual x, y coordinates */
int z; /* pressure value */
int numFingers; /* number of fingers */
int fingerWidth; /* finger width value */
int left, right, up, down; /* left/right/up/down buttons */
int multi[8];
int middle;
int guest_left, guest_mid, guest_right; /* guest device buttons */
int guest_dx, guest_dy; /* guest device movement */
/* Probed hardware properties */
struct SynapticsHwInfo synhw;
/* Parameter data */
int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */
int finger_low, finger_high; /* finger detection values in Z-values */
int tap_time;
int tap_move; /* max. tapping time and movement in packets and coord. */
int single_tap_timeout; /* timeout to recognize a single tap */
int tap_time_2; /* max. tapping time for double taps */
int click_time; /* The duration of a single click */
int fast_taps; /* Faster reaction to single taps */
int emulate_mid_button_time; /* Max time between left and right button presses to
emulate a middle button press. */
int scroll_dist_vert; /* Scrolling distance in absolute coordinates */
int scroll_dist_horiz; /* Scrolling distance in absolute coordinates */
int scroll_edge_vert; /* Enable/disable vertical scrolling on right edge */
int scroll_edge_horiz; /* Enable/disable horizontal scrolling on left edge */
int scroll_twofinger_vert; /* Enable/disable vertical two-finger scrolling */
int scroll_twofinger_horiz; /* Enable/disable horizontal two-finger scrolling */
double min_speed, max_speed, accl; /* movement parameters */
int edge_motion_min_z; /* finger pressure at which minimum edge motion speed is set */
int edge_motion_max_z; /* finger pressure at which maximum edge motion speed is set */
int edge_motion_min_speed; /* slowest setting for edge motion speed */
int edge_motion_max_speed; /* fastest setting for edge motion speed */
int edge_motion_use_always; /* If false, egde motion is used only when dragging */
int updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */
int leftright_button_scrolling; /* Left/right-button scrolling, or two lots of middle button */
int updown_button_repeat; /* If up/down button being used to scroll, auto-repeat?*/
int leftright_button_repeat; /* If left/right button being used to scroll, auto-repeat? */
int scroll_button_repeat; /* time, in milliseconds, between scroll events being
* sent when holding down scroll buttons */
int touchpad_off; /* Switches the touchpad off
* 0 : Not off
* * 1 : Off
* * 2 : Only tapping and scrolling off
* */
int guestmouse_off; /* Switches the guest mouse off */
int locked_drags; /* Enable locked drags */
int tap_action[MAX_TAP]; /* Button to report on tap events */
int circular_scrolling; /* Enable circular scrolling */
double scroll_dist_circ; /* Scrolling angle radians */
double scroll_dist_circ; /* Scrolling angle radians */
int circular_trigger; /* Trigger area for circular scrolling */
int circular_pad; /* Edge has an oval or circular shape */
int palm_detect; /* Enable Palm Detection */
int palm_min_width; /* Palm detection width */
int palm_min_z; /* Palm detection depth */
double coasting_speed; /* Coasting threshold scrolling speed */
int press_motion_min_z; /* finger pressure at which minimum pressure motion factor is applied */
int press_motion_max_z; /* finger pressure at which maximum pressure motion factor is applied */
double press_motion_min_factor; /* factor applied on speed when finger pressure is at minimum */
double press_motion_max_factor; /* factor applied on speed when finger pressure is at minimum */
};
int
main()
{
/*
* We need to map the keyboard and touchpad related share memory to our process
* So that control the touchapd and keyboard!
*/
static cSynapSHMem* p_shmem;// = static_cast(::operator new (sizeof(cSynapSHMem)));
key_t shmem_id;
if((shmem_id = shmget(SHMEM_SYNAP, sizeof(cSynapSHMem), 0)) == -1){
if((shmem_id = shmget(SHMEM_SYNAP, 0, 0)) == -1){
fprintf(stderr, "Can't get share memory!\nYour share memory might be off(SHMconfig option)!\n");
exit(-1);
}else{
fprintf(stderr, "The sizeof memory you allocate might be incorrect!\n");
exit(-1);
}
}
if((p_shmem=static_cast(shmat(shmem_id, NULL, 0))) == NULL){
fprintf(stderr, "Map share memory failed!\n");
exit(-1);
}
/*
* Now we firstly get the status of touchpad I mean on/off/tap off
* then set it to status we need is to be!
*/
int swch;
while(1){
cin>>swch;
swch = swch % 3;
p_shmem->touchpad_off = swch;
usleep(30);
}
}
阅读(6652) | 评论(2) | 转发(0) |