xref: /aosp_15_r20/external/autotest/client/bin/input/linux_ioctl.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li# Description:
6*9c5db199SXin Li#
7*9c5db199SXin Li# Python version of include/asm-generic/ioctl.h
8*9c5db199SXin Li
9*9c5db199SXin Li
10*9c5db199SXin Liimport struct
11*9c5db199SXin Li
12*9c5db199SXin Li
13*9c5db199SXin Li# ioctl command encoding: 32 bits total, command in lower 16 bits,
14*9c5db199SXin Li# size of the parameter structure in the lower 14 bits of the
15*9c5db199SXin Li# upper 16 bits.
16*9c5db199SXin Li# Encoding the size of the parameter structure in the ioctl request
17*9c5db199SXin Li# is useful for catching programs compiled with old versions
18*9c5db199SXin Li# and to avoid overwriting user space outside the user buffer area.
19*9c5db199SXin Li# The highest 2 bits are reserved for indicating the ``access mode''.
20*9c5db199SXin Li# NOTE: This limits the max parameter size to 16kB -1 !
21*9c5db199SXin Li
22*9c5db199SXin Li_IOC_NRBITS    = 8
23*9c5db199SXin Li_IOC_TYPEBITS  = 8
24*9c5db199SXin Li_IOC_SIZEBITS  = 14
25*9c5db199SXin Li_IOC_DIRBITS   = 2
26*9c5db199SXin Li
27*9c5db199SXin Li_IOC_NRMASK    = ((1 << _IOC_NRBITS) - 1)
28*9c5db199SXin Li_IOC_TYPEMASK  = ((1 << _IOC_TYPEBITS) - 1)
29*9c5db199SXin Li_IOC_SIZEMASK  = ((1 << _IOC_SIZEBITS) - 1)
30*9c5db199SXin Li_IOC_DIRMASK   = ((1 << _IOC_DIRBITS) - 1)
31*9c5db199SXin Li
32*9c5db199SXin Li_IOC_NRSHIFT   = 0
33*9c5db199SXin Li_IOC_TYPESHIFT = (_IOC_NRSHIFT + _IOC_NRBITS)
34*9c5db199SXin Li_IOC_SIZESHIFT = (_IOC_TYPESHIFT + _IOC_TYPEBITS)
35*9c5db199SXin Li_IOC_DIRSHIFT  = (_IOC_SIZESHIFT + _IOC_SIZEBITS)
36*9c5db199SXin Li
37*9c5db199SXin LiIOC_NONE      = 0
38*9c5db199SXin LiIOC_WRITE     = 1
39*9c5db199SXin LiIOC_READ      = 2
40*9c5db199SXin Li
41*9c5db199SXin Li# Return the byte size of a python struct format string
42*9c5db199SXin Lidef sizeof(t):
43*9c5db199SXin Li    return struct.calcsize(t)
44*9c5db199SXin Li
45*9c5db199SXin Lidef IOC(d, t, nr, size):
46*9c5db199SXin Li    return ((d << _IOC_DIRSHIFT) | (ord(t) << _IOC_TYPESHIFT) |
47*9c5db199SXin Li            (nr << _IOC_NRSHIFT) | (size << _IOC_SIZESHIFT))
48*9c5db199SXin Li
49*9c5db199SXin Li# used to create numbers
50*9c5db199SXin Lidef IO(t, nr, t_format):
51*9c5db199SXin Li    return IOC(IOC_NONE, t, nr, 0)
52*9c5db199SXin Li
53*9c5db199SXin Lidef IOW(t, nr, t_format):
54*9c5db199SXin Li    return IOC(IOC_WRITE, t, nr, sizeof(t_format))
55*9c5db199SXin Li
56*9c5db199SXin Lidef IOR(t, nr, t_format):
57*9c5db199SXin Li    return IOC(IOC_READ, t, nr, sizeof(t_format))
58*9c5db199SXin Li
59*9c5db199SXin Lidef IOWR(t, nr, t_format):
60*9c5db199SXin Li    return IOC(IOC_READ|_IOC_WRITE, t, nr, sizeof(t_format))
61*9c5db199SXin Li
62*9c5db199SXin Li# used to decode ioctl numbers..
63*9c5db199SXin Lidef IOC_DIR(nr):
64*9c5db199SXin Li    return ((nr >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
65*9c5db199SXin Li
66*9c5db199SXin Lidef IOC_TYPE(nr):
67*9c5db199SXin Li    return ((nr >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
68*9c5db199SXin Li
69*9c5db199SXin Lidef IOC_NR(nr):
70*9c5db199SXin Li    return ((nr >> _IOC_NRSHIFT) & _IOC_NRMASK)
71*9c5db199SXin Li
72*9c5db199SXin Lidef IOC_SIZE(nr):
73*9c5db199SXin Li    return ((nr >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
74*9c5db199SXin Li
75*9c5db199SXin Li# ...and for the drivers/sound files...
76*9c5db199SXin LiIOC_IN          = (IOC_WRITE << _IOC_DIRSHIFT)
77*9c5db199SXin LiIOC_OUT         = (IOC_READ << _IOC_DIRSHIFT)
78*9c5db199SXin LiIOC_INOUT       = ((IOC_WRITE | IOC_READ) << _IOC_DIRSHIFT)
79*9c5db199SXin LiIOCSIZE_MASK    = (_IOC_SIZEMASK << _IOC_SIZESHIFT)
80*9c5db199SXin LiIOCSIZE_SHIFT   = (_IOC_SIZESHIFT)
81*9c5db199SXin Li
82