ARM Linux下添加自定义系统调用(2)

#define __syscall_return(type, res)                                      \

do {                                                                              \

if ((unsigned long)(res) >= (unsigned long)(-125)) {           \

errno = -(res);                                                 \

res = -1;                                                  \

}                                                                         \

return (type) (res);                                                 \

} while (0)

产生的系统调用表sys_call_table定义在entry_common.S,表格包含在calls.S。

/* entry_common.S */

.type         sys_call_table, #object

ENTRY(sys_call_table)

#include "calls.S"

/* calls.S */

.long SYMBOL_NAME(sys_gpioctrl)

2.       真正的函数实现

/* value : 参数地址 */

asmlinkage int sys_gpioctrl( int op, int addr, int value)

{

int v;

copy_from_user( &v, value, sizeof( int));

switch( op ) {

case 0: //OP_GET:

v = *(volatile int *)addr;

copy_to_user(value, &v, sizeof(int));

break;

case 1: //OP_SET:

*(volatile int *)addr = v;

break;

case 2: //OP_EOR:

*(volatile int *)addr ^= v;

break;

case 3: //OP_ORR:

*(volatile unsigned long *)addr |= v;

break;

case 4: //OP_AND:

*(volatile unsigned long *)addr &=v;

break;

default:

break;

}

return 0;

3.       函数说明

系统调用运行于内核空间,用户空间程序通过系统调用传入操作opt、地址addr、值value,进行寄存器的读取、设置等操作。

#define OP_GET   0           /* 获取 */

#define OP_SET   1           /* 设置 */

#define OP_ERR   2           /* 异或 */

#define OP_ORR   3                /* 或 */

#define OP_AND   4           /* 与 */

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxdjw.html