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