usr
/
include
/
linux
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] android
N/A
[DIR] byteorder
N/A
[DIR] caif
N/A
[DIR] can
N/A
[DIR] cifs
N/A
[DIR] dvb
N/A
[DIR] genwqe
N/A
[DIR] hdlc
N/A
[DIR] hsi
N/A
[DIR] iio
N/A
[DIR] isdn
N/A
[DIR] mmc
N/A
[DIR] netfilter
N/A
[DIR] netfilter_arp
N/A
[DIR] netfilter_bridge
N/A
[DIR] netfilter_ipv4
N/A
[DIR] netfilter_ipv6
N/A
[DIR] nfsd
N/A
[DIR] raid
N/A
[DIR] sched
N/A
[DIR] spi
N/A
[DIR] sunrpc
N/A
[DIR] tc_act
N/A
[DIR] tc_ematch
N/A
[DIR] usb
N/A
[DIR] wimax
N/A
a.out.h
6.73 KB
Rename
Delete
acct.h
3.65 KB
Rename
Delete
adb.h
1.11 KB
Rename
Delete
adfs_fs.h
936 bytes
Rename
Delete
affs_hardblocks.h
1.51 KB
Rename
Delete
agpgart.h
3.85 KB
Rename
Delete
aio_abi.h
3.34 KB
Rename
Delete
am437x-vpfe.h
3.59 KB
Rename
Delete
apm_bios.h
3.60 KB
Rename
Delete
arcfb.h
213 bytes
Rename
Delete
arm_sdei.h
2.69 KB
Rename
Delete
aspeed-lpc-ctrl.h
1.74 KB
Rename
Delete
atalk.h
1023 bytes
Rename
Delete
atm.h
7.70 KB
Rename
Delete
atm_eni.h
648 bytes
Rename
Delete
atm_he.h
406 bytes
Rename
Delete
atm_idt77105.h
955 bytes
Rename
Delete
atm_nicstar.h
1.25 KB
Rename
Delete
atm_tcp.h
1.58 KB
Rename
Delete
atm_zatm.h
1.50 KB
Rename
Delete
atmapi.h
952 bytes
Rename
Delete
atmarp.h
1.27 KB
Rename
Delete
atmbr2684.h
3.19 KB
Rename
Delete
atmclip.h
576 bytes
Rename
Delete
atmdev.h
7.50 KB
Rename
Delete
atmioc.h
1.61 KB
Rename
Delete
atmlec.h
2.33 KB
Rename
Delete
atmmpc.h
4.13 KB
Rename
Delete
atmppp.h
639 bytes
Rename
Delete
atmsap.h
4.85 KB
Rename
Delete
atmsvc.h
1.81 KB
Rename
Delete
audit.h
19.92 KB
Rename
Delete
auto_dev-ioctl.h
4.87 KB
Rename
Delete
auto_fs.h
6.28 KB
Rename
Delete
auto_fs4.h
451 bytes
Rename
Delete
auxvec.h
1.56 KB
Rename
Delete
ax25.h
2.76 KB
Rename
Delete
b1lli.h
1.68 KB
Rename
Delete
batadv_packet.h
20.01 KB
Rename
Delete
batman_adv.h
11.70 KB
Rename
Delete
baycom.h
883 bytes
Rename
Delete
bcache.h
8.17 KB
Rename
Delete
bcm933xx_hcs.h
419 bytes
Rename
Delete
bfs_fs.h
1.85 KB
Rename
Delete
binfmts.h
628 bytes
Rename
Delete
blkpg.h
904 bytes
Rename
Delete
blktrace_api.h
4.59 KB
Rename
Delete
blkzoned.h
6.45 KB
Rename
Delete
bpf.h
223.30 KB
Rename
Delete
bpf_common.h
1.33 KB
Rename
Delete
bpf_perf_event.h
529 bytes
Rename
Delete
bpfilter.h
465 bytes
Rename
Delete
bpqether.h
981 bytes
Rename
Delete
bsg.h
2.44 KB
Rename
Delete
bt-bmc.h
572 bytes
Rename
Delete
btf.h
4.68 KB
Rename
Delete
btrfs.h
28.24 KB
Rename
Delete
btrfs_tree.h
24.69 KB
Rename
Delete
can.h
7.70 KB
Rename
Delete
capability.h
13.20 KB
Rename
Delete
capi.h
3.05 KB
Rename
Delete
cciss_defs.h
3.20 KB
Rename
Delete
cciss_ioctl.h
2.70 KB
Rename
Delete
cdrom.h
28.18 KB
Rename
Delete
cec-funcs.h
52.64 KB
Rename
Delete
cec.h
36.81 KB
Rename
Delete
cfm_bridge.h
1.42 KB
Rename
Delete
cgroupstats.h
2.17 KB
Rename
Delete
chio.h
5.22 KB
Rename
Delete
close_range.h
377 bytes
Rename
Delete
cm4000_cs.h
1.76 KB
Rename
Delete
cn_proc.h
3.38 KB
Rename
Delete
coda.h
17.09 KB
Rename
Delete
coda_psdev.h
783 bytes
Rename
Delete
coff.h
12.18 KB
Rename
Delete
connector.h
2.20 KB
Rename
Delete
const.h
788 bytes
Rename
Delete
coresight-stm.h
674 bytes
Rename
Delete
cramfs_fs.h
3.47 KB
Rename
Delete
cryptouser.h
3.31 KB
Rename
Delete
cuda.h
905 bytes
Rename
Delete
cyclades.h
16.71 KB
Rename
Delete
cycx_cfm.h
2.92 KB
Rename
Delete
dcbnl.h
24.65 KB
Rename
Delete
dccp.h
6.29 KB
Rename
Delete
devlink.h
21.05 KB
Rename
Delete
dlm.h
2.49 KB
Rename
Delete
dlm_device.h
2.48 KB
Rename
Delete
dlm_netlink.h
1.13 KB
Rename
Delete
dlm_plock.h
894 bytes
Rename
Delete
dlmconstants.h
4.96 KB
Rename
Delete
dm-ioctl.h
11.13 KB
Rename
Delete
dm-log-userspace.h
14.83 KB
Rename
Delete
dma-buf.h
5.12 KB
Rename
Delete
dn.h
4.53 KB
Rename
Delete
dqblk_xfs.h
9.03 KB
Rename
Delete
edd.h
5.47 KB
Rename
Delete
efs_fs_sb.h
2.17 KB
Rename
Delete
elf-em.h
2.14 KB
Rename
Delete
elf-fdpic.h
1.10 KB
Rename
Delete
elf.h
13.16 KB
Rename
Delete
elfcore.h
2.92 KB
Rename
Delete
errno.h
23 bytes
Rename
Delete
errqueue.h
1.44 KB
Rename
Delete
erspan.h
1.03 KB
Rename
Delete
ethtool.h
81.89 KB
Rename
Delete
ethtool_netlink.h
22.29 KB
Rename
Delete
eventpoll.h
2.67 KB
Rename
Delete
fadvise.h
842 bytes
Rename
Delete
falloc.h
3.50 KB
Rename
Delete
fanotify.h
5.22 KB
Rename
Delete
fb.h
16.09 KB
Rename
Delete
fcntl.h
4.08 KB
Rename
Delete
fd.h
11.40 KB
Rename
Delete
fdreg.h
5.29 KB
Rename
Delete
fib_rules.h
1.99 KB
Rename
Delete
fiemap.h
2.71 KB
Rename
Delete
filter.h
2.16 KB
Rename
Delete
firewire-cdev.h
42.86 KB
Rename
Delete
firewire-constants.h
3.16 KB
Rename
Delete
flat.h
2.10 KB
Rename
Delete
fou.h
694 bytes
Rename
Delete
fpga-dfl.h
8.52 KB
Rename
Delete
fs.h
13.11 KB
Rename
Delete
fsl_hypervisor.h
7.13 KB
Rename
Delete
fsmap.h
4.29 KB
Rename
Delete
fuse.h
22.92 KB
Rename
Delete
futex.h
4.88 KB
Rename
Delete
gameport.h
897 bytes
Rename
Delete
gen_stats.h
1.49 KB
Rename
Delete
genetlink.h
2.12 KB
Rename
Delete
gfs2_ondisk.h
14.40 KB
Rename
Delete
gigaset_dev.h
1.41 KB
Rename
Delete
gpio.h
6.59 KB
Rename
Delete
gsmmux.h
1.02 KB
Rename
Delete
gtp.h
681 bytes
Rename
Delete
hash_info.h
921 bytes
Rename
Delete
hdlc.h
637 bytes
Rename
Delete
hdlcdrv.h
2.84 KB
Rename
Delete
hdreg.h
22.17 KB
Rename
Delete
hid.h
1.86 KB
Rename
Delete
hiddev.h
6.20 KB
Rename
Delete
hidraw.h
1.95 KB
Rename
Delete
hpet.h
743 bytes
Rename
Delete
hsr_netlink.h
1.06 KB
Rename
Delete
hw_breakpoint.h
742 bytes
Rename
Delete
hyperv.h
10.89 KB
Rename
Delete
hysdn_if.h
1.35 KB
Rename
Delete
i2c-dev.h
2.55 KB
Rename
Delete
i2c.h
6.96 KB
Rename
Delete
i2o-dev.h
11.28 KB
Rename
Delete
i8k.h
1.49 KB
Rename
Delete
icmp.h
2.91 KB
Rename
Delete
icmpv6.h
3.94 KB
Rename
Delete
idxd.h
8.22 KB
Rename
Delete
if.h
10.65 KB
Rename
Delete
if_addr.h
1.84 KB
Rename
Delete
if_addrlabel.h
721 bytes
Rename
Delete
if_alg.h
946 bytes
Rename
Delete
if_arcnet.h
3.63 KB
Rename
Delete
if_arp.h
6.42 KB
Rename
Delete
if_bonding.h
5.17 KB
Rename
Delete
if_bridge.h
19.06 KB
Rename
Delete
if_cablemodem.h
986 bytes
Rename
Delete
if_eql.h
1.32 KB
Rename
Delete
if_ether.h
8.05 KB
Rename
Delete
if_fc.h
1.70 KB
Rename
Delete
if_fddi.h
3.66 KB
Rename
Delete
if_frad.h
2.95 KB
Rename
Delete
if_hippi.h
4.14 KB
Rename
Delete
if_infiniband.h
1.22 KB
Rename
Delete
if_link.h
30.28 KB
Rename
Delete
if_ltalk.h
210 bytes
Rename
Delete
if_macsec.h
5.70 KB
Rename
Delete
if_packet.h
7.73 KB
Rename
Delete
if_phonet.h
424 bytes
Rename
Delete
if_plip.h
660 bytes
Rename
Delete
if_ppp.h
29 bytes
Rename
Delete
if_pppol2tp.h
3.21 KB
Rename
Delete
if_pppox.h
4.76 KB
Rename
Delete
if_slip.h
872 bytes
Rename
Delete
if_team.h
2.54 KB
Rename
Delete
if_tun.h
4.00 KB
Rename
Delete
if_tunnel.h
4.41 KB
Rename
Delete
if_vlan.h
1.79 KB
Rename
Delete
if_x25.h
881 bytes
Rename
Delete
if_xdp.h
2.94 KB
Rename
Delete
ife.h
351 bytes
Rename
Delete
igmp.h
2.99 KB
Rename
Delete
ila.h
1.22 KB
Rename
Delete
in.h
9.78 KB
Rename
Delete
in6.h
7.26 KB
Rename
Delete
in_route.h
936 bytes
Rename
Delete
inet_diag.h
4.56 KB
Rename
Delete
inotify.h
3.21 KB
Rename
Delete
input-event-codes.h
27.94 KB
Rename
Delete
input.h
15.61 KB
Rename
Delete
io_uring.h
6.06 KB
Rename
Delete
ioctl.h
163 bytes
Rename
Delete
iommu.h
4.79 KB
Rename
Delete
ip.h
4.62 KB
Rename
Delete
ip6_tunnel.h
1.91 KB
Rename
Delete
ip_vs.h
13.31 KB
Rename
Delete
ipc.h
2.05 KB
Rename
Delete
ipmi.h
15.08 KB
Rename
Delete
ipmi_bmc.h
464 bytes
Rename
Delete
ipmi_msgdefs.h
3.35 KB
Rename
Delete
ipmi_ssif_bmc.h
441 bytes
Rename
Delete
ipsec.h
947 bytes
Rename
Delete
ipv6.h
3.87 KB
Rename
Delete
ipv6_route.h
1.86 KB
Rename
Delete
ipx.h
2.29 KB
Rename
Delete
irqnr.h
104 bytes
Rename
Delete
isdn.h
5.64 KB
Rename
Delete
isdn_divertif.h
1.17 KB
Rename
Delete
isdn_ppp.h
1.88 KB
Rename
Delete
isdnif.h
2.31 KB
Rename
Delete
iso_fs.h
6.33 KB
Rename
Delete
isst_if.h
5.26 KB
Rename
Delete
ivtv.h
2.95 KB
Rename
Delete
ivtvfb.h
1.18 KB
Rename
Delete
jffs2.h
6.85 KB
Rename
Delete
joystick.h
3.35 KB
Rename
Delete
kcm.h
822 bytes
Rename
Delete
kcmp.h
522 bytes
Rename
Delete
kcov.h
1.07 KB
Rename
Delete
kd.h
6.11 KB
Rename
Delete
kdev_t.h
383 bytes
Rename
Delete
kernel-page-flags.h
900 bytes
Rename
Delete
kernel.h
438 bytes
Rename
Delete
kernelcapi.h
1019 bytes
Rename
Delete
kexec.h
1.79 KB
Rename
Delete
keyboard.h
12.48 KB
Rename
Delete
keyctl.h
3.42 KB
Rename
Delete
kfd_ioctl.h
28.14 KB
Rename
Delete
kfd_sysfs.h
4.25 KB
Rename
Delete
kvm.h
60.12 KB
Rename
Delete
kvm_para.h
1001 bytes
Rename
Delete
l2tp.h
5.46 KB
Rename
Delete
libc-compat.h
8.09 KB
Rename
Delete
lightnvm.h
4.92 KB
Rename
Delete
limits.h
937 bytes
Rename
Delete
lirc.h
7.63 KB
Rename
Delete
llc.h
3.09 KB
Rename
Delete
loop.h
3.42 KB
Rename
Delete
lp.h
4.09 KB
Rename
Delete
lwtunnel.h
2.13 KB
Rename
Delete
magic.h
3.45 KB
Rename
Delete
major.h
4.60 KB
Rename
Delete
map_to_7segment.h
7.08 KB
Rename
Delete
matroxfb.h
1.43 KB
Rename
Delete
max2175.h
1.01 KB
Rename
Delete
mdio.h
16.87 KB
Rename
Delete
media-bus-format.h
6.26 KB
Rename
Delete
media.h
11.12 KB
Rename
Delete
mei.h
3.39 KB
Rename
Delete
membarrier.h
7.71 KB
Rename
Delete
memfd.h
1.29 KB
Rename
Delete
mempolicy.h
2.18 KB
Rename
Delete
meye.h
2.47 KB
Rename
Delete
mic_common.h
6.37 KB
Rename
Delete
mic_ioctl.h
2.20 KB
Rename
Delete
mii.h
9.27 KB
Rename
Delete
minix_fs.h
2.07 KB
Rename
Delete
mman.h
1.35 KB
Rename
Delete
mmtimer.h
2.07 KB
Rename
Delete
module.h
255 bytes
Rename
Delete
mount.h
4.44 KB
Rename
Delete
mpls.h
2.25 KB
Rename
Delete
mpls_iptunnel.h
761 bytes
Rename
Delete
mptcp.h
5.48 KB
Rename
Delete
mqueue.h
2.15 KB
Rename
Delete
mroute.h
5.30 KB
Rename
Delete
mroute6.h
4.47 KB
Rename
Delete
mrp_bridge.h
1.67 KB
Rename
Delete
msdos_fs.h
6.80 KB
Rename
Delete
msg.h
3.29 KB
Rename
Delete
mtio.h
7.98 KB
Rename
Delete
n_r3964.h
2.35 KB
Rename
Delete
nbd-netlink.h
2.35 KB
Rename
Delete
nbd.h
2.95 KB
Rename
Delete
ncsi.h
3.79 KB
Rename
Delete
ndctl.h
6.71 KB
Rename
Delete
neighbour.h
5.02 KB
Rename
Delete
net.h
2.04 KB
Rename
Delete
net_dropmon.h
2.85 KB
Rename
Delete
net_namespace.h
715 bytes
Rename
Delete
net_tstamp.h
5.67 KB
Rename
Delete
netconf.h
614 bytes
Rename
Delete
netdevice.h
2.20 KB
Rename
Delete
netfilter.h
1.78 KB
Rename
Delete
netfilter_arp.h
445 bytes
Rename
Delete
netfilter_bridge.h
1.14 KB
Rename
Delete
netfilter_decnet.h
1.93 KB
Rename
Delete
netfilter_ipv4.h
2.12 KB
Rename
Delete
netfilter_ipv6.h
2.14 KB
Rename
Delete
netlink.h
11.23 KB
Rename
Delete
netlink_diag.h
1.49 KB
Rename
Delete
netrom.h
807 bytes
Rename
Delete
nexthop.h
1.50 KB
Rename
Delete
nfc.h
10.95 KB
Rename
Delete
nfs.h
4.39 KB
Rename
Delete
nfs2.h
1.43 KB
Rename
Delete
nfs3.h
2.40 KB
Rename
Delete
nfs4.h
6.44 KB
Rename
Delete
nfs4_mount.h
1.89 KB
Rename
Delete
nfs_fs.h
1.60 KB
Rename
Delete
nfs_idmap.h
2.19 KB
Rename
Delete
nfs_mount.h
2.09 KB
Rename
Delete
nfsacl.h
718 bytes
Rename
Delete
nilfs2_api.h
7.41 KB
Rename
Delete
nilfs2_ondisk.h
17.61 KB
Rename
Delete
nitro_enclaves.h
12.84 KB
Rename
Delete
nl80211.h
327.41 KB
Rename
Delete
nsfs.h
639 bytes
Rename
Delete
nubus.h
8.00 KB
Rename
Delete
nvme_ioctl.h
2.06 KB
Rename
Delete
nvram.h
532 bytes
Rename
Delete
omap3isp.h
20.36 KB
Rename
Delete
omapfb.h
5.78 KB
Rename
Delete
oom.h
511 bytes
Rename
Delete
openat2.h
1.26 KB
Rename
Delete
openvswitch.h
39.24 KB
Rename
Delete
packet_diag.h
1.63 KB
Rename
Delete
param.h
141 bytes
Rename
Delete
parport.h
3.56 KB
Rename
Delete
patchkey.h
892 bytes
Rename
Delete
pci.h
1.35 KB
Rename
Delete
pci_regs.h
56.47 KB
Rename
Delete
pcitest.h
711 bytes
Rename
Delete
perf_event.h
39.63 KB
Rename
Delete
personality.h
2.05 KB
Rename
Delete
pfkeyv2.h
10.32 KB
Rename
Delete
pfrut.h
7.80 KB
Rename
Delete
pg.h
2.34 KB
Rename
Delete
phantom.h
1.62 KB
Rename
Delete
phonet.h
4.57 KB
Rename
Delete
pkt_cls.h
18.08 KB
Rename
Delete
pkt_sched.h
29.59 KB
Rename
Delete
pktcdvd.h
2.62 KB
Rename
Delete
pmu.h
5.19 KB
Rename
Delete
poll.h
22 bytes
Rename
Delete
posix_acl.h
1.22 KB
Rename
Delete
posix_acl_xattr.h
1.09 KB
Rename
Delete
posix_types.h
1.07 KB
Rename
Delete
ppdev.h
3.14 KB
Rename
Delete
ppp-comp.h
2.47 KB
Rename
Delete
ppp-ioctl.h
5.35 KB
Rename
Delete
ppp_defs.h
4.99 KB
Rename
Delete
pps.h
4.62 KB
Rename
Delete
pr.h
1.05 KB
Rename
Delete
prctl.h
7.83 KB
Rename
Delete
psample.h
2.22 KB
Rename
Delete
psci.h
4.23 KB
Rename
Delete
psp-sev.h
4.48 KB
Rename
Delete
ptp_clock.h
7.28 KB
Rename
Delete
ptrace.h
3.59 KB
Rename
Delete
qemu_fw_cfg.h
2.41 KB
Rename
Delete
qnx4_fs.h
2.27 KB
Rename
Delete
qnxtypes.h
624 bytes
Rename
Delete
qrtr.h
893 bytes
Rename
Delete
quota.h
6.14 KB
Rename
Delete
radeonfb.h
360 bytes
Rename
Delete
random.h
1.34 KB
Rename
Delete
raw.h
365 bytes
Rename
Delete
rds.h
9.08 KB
Rename
Delete
reboot.h
1.31 KB
Rename
Delete
reiserfs_fs.h
775 bytes
Rename
Delete
reiserfs_xattr.h
533 bytes
Rename
Delete
resource.h
2.29 KB
Rename
Delete
rfkill.h
6.45 KB
Rename
Delete
rio_cm_cdev.h
3.17 KB
Rename
Delete
rio_mport_cdev.h
9.11 KB
Rename
Delete
romfs_fs.h
1.21 KB
Rename
Delete
rose.h
2.18 KB
Rename
Delete
route.h
2.28 KB
Rename
Delete
rpmsg.h
544 bytes
Rename
Delete
rseq.h
4.79 KB
Rename
Delete
rtc.h
3.92 KB
Rename
Delete
rtnetlink.h
19.73 KB
Rename
Delete
rxrpc.h
4.96 KB
Rename
Delete
scc.h
4.49 KB
Rename
Delete
sched.h
2.73 KB
Rename
Delete
scif_ioctl.h
6.23 KB
Rename
Delete
screen_info.h
2.42 KB
Rename
Delete
sctp.h
35.15 KB
Rename
Delete
sdla.h
2.77 KB
Rename
Delete
seccomp.h
2.20 KB
Rename
Delete
securebits.h
2.64 KB
Rename
Delete
sed-opal.h
3.20 KB
Rename
Delete
seg6.h
1.14 KB
Rename
Delete
seg6_genl.h
589 bytes
Rename
Delete
seg6_hmac.h
423 bytes
Rename
Delete
seg6_iptunnel.h
927 bytes
Rename
Delete
seg6_local.h
2.01 KB
Rename
Delete
selinux_netlink.h
1.17 KB
Rename
Delete
sem.h
2.97 KB
Rename
Delete
serial.h
3.78 KB
Rename
Delete
serial_core.h
6.10 KB
Rename
Delete
serial_reg.h
15.13 KB
Rename
Delete
serio.h
1.99 KB
Rename
Delete
sev-guest.h
2.25 KB
Rename
Delete
shm.h
3.70 KB
Rename
Delete
signal.h
388 bytes
Rename
Delete
signalfd.h
1.20 KB
Rename
Delete
smc.h
8.31 KB
Rename
Delete
smc_diag.h
2.66 KB
Rename
Delete
smiapp.h
1.03 KB
Rename
Delete
snmp.h
13.34 KB
Rename
Delete
sock_diag.h
1.27 KB
Rename
Delete
socket.h
901 bytes
Rename
Delete
sockios.h
5.96 KB
Rename
Delete
sonet.h
2.24 KB
Rename
Delete
sonypi.h
5.18 KB
Rename
Delete
sound.h
1.21 KB
Rename
Delete
soundcard.h
44.96 KB
Rename
Delete
stat.h
6.20 KB
Rename
Delete
stddef.h
1.50 KB
Rename
Delete
stm.h
1.25 KB
Rename
Delete
string.h
238 bytes
Rename
Delete
suspend_ioctls.h
1.40 KB
Rename
Delete
swab.h
6.76 KB
Rename
Delete
switchtec_ioctl.h
5.14 KB
Rename
Delete
sync_file.h
2.82 KB
Rename
Delete
synclink.h
8.77 KB
Rename
Delete
sysctl.h
25.24 KB
Rename
Delete
sysinfo.h
1.02 KB
Rename
Delete
target_core_user.h
4.52 KB
Rename
Delete
taskstats.h
7.01 KB
Rename
Delete
tcp.h
9.69 KB
Rename
Delete
tcp_metrics.h
1.51 KB
Rename
Delete
tdx-guest.h
1.27 KB
Rename
Delete
tee.h
12.86 KB
Rename
Delete
termios.h
506 bytes
Rename
Delete
thermal.h
3.23 KB
Rename
Delete
time.h
1.71 KB
Rename
Delete
time_types.h
1.15 KB
Rename
Delete
timerfd.h
936 bytes
Rename
Delete
times.h
278 bytes
Rename
Delete
timex.h
6.25 KB
Rename
Delete
tiocl.h
1.69 KB
Rename
Delete
tipc.h
8.62 KB
Rename
Delete
tipc_config.h
14.36 KB
Rename
Delete
tipc_netlink.h
9.17 KB
Rename
Delete
tipc_sockets_diag.h
468 bytes
Rename
Delete
tls.h
4.19 KB
Rename
Delete
toshiba.h
1.88 KB
Rename
Delete
tty.h
1.55 KB
Rename
Delete
tty_flags.h
4.42 KB
Rename
Delete
types.h
1.44 KB
Rename
Delete
udf_fs_i.h
697 bytes
Rename
Delete
udp.h
1.62 KB
Rename
Delete
uhid.h
4.54 KB
Rename
Delete
uinput.h
9.04 KB
Rename
Delete
uio.h
732 bytes
Rename
Delete
uleds.h
798 bytes
Rename
Delete
ultrasound.h
4.46 KB
Rename
Delete
un.h
384 bytes
Rename
Delete
unistd.h
220 bytes
Rename
Delete
unix_diag.h
1.22 KB
Rename
Delete
usbdevice_fs.h
8.12 KB
Rename
Delete
usbip.h
640 bytes
Rename
Delete
userfaultfd.h
7.59 KB
Rename
Delete
userio.h
1.48 KB
Rename
Delete
utime.h
215 bytes
Rename
Delete
utsname.h
669 bytes
Rename
Delete
uuid.h
1.32 KB
Rename
Delete
uvcvideo.h
2.57 KB
Rename
Delete
v4l2-common.h
4.08 KB
Rename
Delete
v4l2-controls.h
50.56 KB
Rename
Delete
v4l2-dv-timings.h
30.82 KB
Rename
Delete
v4l2-mediabus.h
4.98 KB
Rename
Delete
v4l2-subdev.h
5.95 KB
Rename
Delete
vbox_err.h
7.09 KB
Rename
Delete
vbox_vmmdev_types.h
8.16 KB
Rename
Delete
vboxguest.h
8.52 KB
Rename
Delete
vdpa.h
1.39 KB
Rename
Delete
version.h
430 bytes
Rename
Delete
veth.h
224 bytes
Rename
Delete
vfio.h
51.00 KB
Rename
Delete
vfio_ccw.h
1.29 KB
Rename
Delete
vfio_zdev.h
2.48 KB
Rename
Delete
vhost.h
6.27 KB
Rename
Delete
vhost_types.h
3.90 KB
Rename
Delete
videodev2.h
88.61 KB
Rename
Delete
virtio_9p.h
1.99 KB
Rename
Delete
virtio_balloon.h
5.15 KB
Rename
Delete
virtio_blk.h
6.64 KB
Rename
Delete
virtio_bt.h
772 bytes
Rename
Delete
virtio_config.h
3.91 KB
Rename
Delete
virtio_console.h
3.06 KB
Rename
Delete
virtio_crypto.h
13.55 KB
Rename
Delete
virtio_fs.h
572 bytes
Rename
Delete
virtio_gpu.h
11.19 KB
Rename
Delete
virtio_ids.h
3.19 KB
Rename
Delete
virtio_input.h
2.45 KB
Rename
Delete
virtio_iommu.h
3.69 KB
Rename
Delete
virtio_mem.h
6.99 KB
Rename
Delete
virtio_mmio.h
4.85 KB
Rename
Delete
virtio_net.h
10.30 KB
Rename
Delete
virtio_pci.h
7.23 KB
Rename
Delete
virtio_ring.h
7.32 KB
Rename
Delete
virtio_rng.h
265 bytes
Rename
Delete
virtio_scsi.h
5.89 KB
Rename
Delete
virtio_snd.h
9.09 KB
Rename
Delete
virtio_types.h
2.10 KB
Rename
Delete
virtio_vsock.h
3.01 KB
Rename
Delete
vm_sockets.h
6.34 KB
Rename
Delete
vm_sockets_diag.h
963 bytes
Rename
Delete
vmcore.h
431 bytes
Rename
Delete
vsockmon.h
1.84 KB
Rename
Delete
vt.h
2.99 KB
Rename
Delete
vtpm_proxy.h
1.68 KB
Rename
Delete
wait.h
682 bytes
Rename
Delete
wanrouter.h
453 bytes
Rename
Delete
watchdog.h
2.28 KB
Rename
Delete
wimax.h
8.17 KB
Rename
Delete
wireless.h
41.70 KB
Rename
Delete
wmi.h
1.84 KB
Rename
Delete
x25.h
3.48 KB
Rename
Delete
xattr.h
2.79 KB
Rename
Delete
xdp_diag.h
1.43 KB
Rename
Delete
xfrm.h
11.71 KB
Rename
Delete
xilinx-v4l2-controls.h
2.91 KB
Rename
Delete
zorro.h
3.22 KB
Rename
Delete
zorro_ids.h
29.26 KB
Rename
Delete
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ /* * cec - HDMI Consumer Electronics Control message functions * * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved. */ #ifndef _CEC_UAPI_FUNCS_H #define _CEC_UAPI_FUNCS_H #include <linux/cec.h> /* One Touch Play Feature */ static __inline__ void cec_msg_active_source(struct cec_msg *msg, __u16 phys_addr) { msg->len = 4; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_ACTIVE_SOURCE; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; } static __inline__ void cec_ops_active_source(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_image_view_on(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_IMAGE_VIEW_ON; } static __inline__ void cec_msg_text_view_on(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_TEXT_VIEW_ON; } /* Routing Control Feature */ static __inline__ void cec_msg_inactive_source(struct cec_msg *msg, __u16 phys_addr) { msg->len = 4; msg->msg[1] = CEC_MSG_INACTIVE_SOURCE; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; } static __inline__ void cec_ops_inactive_source(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_request_active_source(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_REQUEST_ACTIVE_SOURCE; msg->reply = reply ? CEC_MSG_ACTIVE_SOURCE : 0; } static __inline__ void cec_msg_routing_information(struct cec_msg *msg, __u16 phys_addr) { msg->len = 4; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_ROUTING_INFORMATION; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; } static __inline__ void cec_ops_routing_information(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_routing_change(struct cec_msg *msg, int reply, __u16 orig_phys_addr, __u16 new_phys_addr) { msg->len = 6; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_ROUTING_CHANGE; msg->msg[2] = orig_phys_addr >> 8; msg->msg[3] = orig_phys_addr & 0xff; msg->msg[4] = new_phys_addr >> 8; msg->msg[5] = new_phys_addr & 0xff; msg->reply = reply ? CEC_MSG_ROUTING_INFORMATION : 0; } static __inline__ void cec_ops_routing_change(const struct cec_msg *msg, __u16 *orig_phys_addr, __u16 *new_phys_addr) { *orig_phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *new_phys_addr = (msg->msg[4] << 8) | msg->msg[5]; } static __inline__ void cec_msg_set_stream_path(struct cec_msg *msg, __u16 phys_addr) { msg->len = 4; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_SET_STREAM_PATH; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; } static __inline__ void cec_ops_set_stream_path(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } /* Standby Feature */ static __inline__ void cec_msg_standby(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_STANDBY; } /* One Touch Record Feature */ static __inline__ void cec_msg_record_off(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_RECORD_OFF; msg->reply = reply ? CEC_MSG_RECORD_STATUS : 0; } struct cec_op_arib_data { __u16 transport_id; __u16 service_id; __u16 orig_network_id; }; struct cec_op_atsc_data { __u16 transport_id; __u16 program_number; }; struct cec_op_dvb_data { __u16 transport_id; __u16 service_id; __u16 orig_network_id; }; struct cec_op_channel_data { __u8 channel_number_fmt; __u16 major; __u16 minor; }; struct cec_op_digital_service_id { __u8 service_id_method; __u8 dig_bcast_system; union { struct cec_op_arib_data arib; struct cec_op_atsc_data atsc; struct cec_op_dvb_data dvb; struct cec_op_channel_data channel; }; }; struct cec_op_record_src { __u8 type; union { struct cec_op_digital_service_id digital; struct { __u8 ana_bcast_type; __u16 ana_freq; __u8 bcast_system; } analog; struct { __u8 plug; } ext_plug; struct { __u16 phys_addr; } ext_phys_addr; }; }; static __inline__ void cec_set_digital_service_id(__u8 *msg, const struct cec_op_digital_service_id *digital) { *msg++ = (digital->service_id_method << 7) | digital->dig_bcast_system; if (digital->service_id_method == CEC_OP_SERVICE_ID_METHOD_BY_CHANNEL) { *msg++ = (digital->channel.channel_number_fmt << 2) | (digital->channel.major >> 8); *msg++ = digital->channel.major & 0xff; *msg++ = digital->channel.minor >> 8; *msg++ = digital->channel.minor & 0xff; *msg++ = 0; *msg++ = 0; return; } switch (digital->dig_bcast_system) { case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN: case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE: case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT: case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T: *msg++ = digital->atsc.transport_id >> 8; *msg++ = digital->atsc.transport_id & 0xff; *msg++ = digital->atsc.program_number >> 8; *msg++ = digital->atsc.program_number & 0xff; *msg++ = 0; *msg++ = 0; break; default: *msg++ = digital->dvb.transport_id >> 8; *msg++ = digital->dvb.transport_id & 0xff; *msg++ = digital->dvb.service_id >> 8; *msg++ = digital->dvb.service_id & 0xff; *msg++ = digital->dvb.orig_network_id >> 8; *msg++ = digital->dvb.orig_network_id & 0xff; break; } } static __inline__ void cec_get_digital_service_id(const __u8 *msg, struct cec_op_digital_service_id *digital) { digital->service_id_method = msg[0] >> 7; digital->dig_bcast_system = msg[0] & 0x7f; if (digital->service_id_method == CEC_OP_SERVICE_ID_METHOD_BY_CHANNEL) { digital->channel.channel_number_fmt = msg[1] >> 2; digital->channel.major = ((msg[1] & 3) << 6) | msg[2]; digital->channel.minor = (msg[3] << 8) | msg[4]; return; } digital->dvb.transport_id = (msg[1] << 8) | msg[2]; digital->dvb.service_id = (msg[3] << 8) | msg[4]; digital->dvb.orig_network_id = (msg[5] << 8) | msg[6]; } static __inline__ void cec_msg_record_on_own(struct cec_msg *msg) { msg->len = 3; msg->msg[1] = CEC_MSG_RECORD_ON; msg->msg[2] = CEC_OP_RECORD_SRC_OWN; } static __inline__ void cec_msg_record_on_digital(struct cec_msg *msg, const struct cec_op_digital_service_id *digital) { msg->len = 10; msg->msg[1] = CEC_MSG_RECORD_ON; msg->msg[2] = CEC_OP_RECORD_SRC_DIGITAL; cec_set_digital_service_id(msg->msg + 3, digital); } static __inline__ void cec_msg_record_on_analog(struct cec_msg *msg, __u8 ana_bcast_type, __u16 ana_freq, __u8 bcast_system) { msg->len = 7; msg->msg[1] = CEC_MSG_RECORD_ON; msg->msg[2] = CEC_OP_RECORD_SRC_ANALOG; msg->msg[3] = ana_bcast_type; msg->msg[4] = ana_freq >> 8; msg->msg[5] = ana_freq & 0xff; msg->msg[6] = bcast_system; } static __inline__ void cec_msg_record_on_plug(struct cec_msg *msg, __u8 plug) { msg->len = 4; msg->msg[1] = CEC_MSG_RECORD_ON; msg->msg[2] = CEC_OP_RECORD_SRC_EXT_PLUG; msg->msg[3] = plug; } static __inline__ void cec_msg_record_on_phys_addr(struct cec_msg *msg, __u16 phys_addr) { msg->len = 5; msg->msg[1] = CEC_MSG_RECORD_ON; msg->msg[2] = CEC_OP_RECORD_SRC_EXT_PHYS_ADDR; msg->msg[3] = phys_addr >> 8; msg->msg[4] = phys_addr & 0xff; } static __inline__ void cec_msg_record_on(struct cec_msg *msg, int reply, const struct cec_op_record_src *rec_src) { switch (rec_src->type) { case CEC_OP_RECORD_SRC_OWN: cec_msg_record_on_own(msg); break; case CEC_OP_RECORD_SRC_DIGITAL: cec_msg_record_on_digital(msg, &rec_src->digital); break; case CEC_OP_RECORD_SRC_ANALOG: cec_msg_record_on_analog(msg, rec_src->analog.ana_bcast_type, rec_src->analog.ana_freq, rec_src->analog.bcast_system); break; case CEC_OP_RECORD_SRC_EXT_PLUG: cec_msg_record_on_plug(msg, rec_src->ext_plug.plug); break; case CEC_OP_RECORD_SRC_EXT_PHYS_ADDR: cec_msg_record_on_phys_addr(msg, rec_src->ext_phys_addr.phys_addr); break; } msg->reply = reply ? CEC_MSG_RECORD_STATUS : 0; } static __inline__ void cec_ops_record_on(const struct cec_msg *msg, struct cec_op_record_src *rec_src) { rec_src->type = msg->msg[2]; switch (rec_src->type) { case CEC_OP_RECORD_SRC_OWN: break; case CEC_OP_RECORD_SRC_DIGITAL: cec_get_digital_service_id(msg->msg + 3, &rec_src->digital); break; case CEC_OP_RECORD_SRC_ANALOG: rec_src->analog.ana_bcast_type = msg->msg[3]; rec_src->analog.ana_freq = (msg->msg[4] << 8) | msg->msg[5]; rec_src->analog.bcast_system = msg->msg[6]; break; case CEC_OP_RECORD_SRC_EXT_PLUG: rec_src->ext_plug.plug = msg->msg[3]; break; case CEC_OP_RECORD_SRC_EXT_PHYS_ADDR: rec_src->ext_phys_addr.phys_addr = (msg->msg[3] << 8) | msg->msg[4]; break; } } static __inline__ void cec_msg_record_status(struct cec_msg *msg, __u8 rec_status) { msg->len = 3; msg->msg[1] = CEC_MSG_RECORD_STATUS; msg->msg[2] = rec_status; } static __inline__ void cec_ops_record_status(const struct cec_msg *msg, __u8 *rec_status) { *rec_status = msg->msg[2]; } static __inline__ void cec_msg_record_tv_screen(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_RECORD_TV_SCREEN; msg->reply = reply ? CEC_MSG_RECORD_ON : 0; } /* Timer Programming Feature */ static __inline__ void cec_msg_timer_status(struct cec_msg *msg, __u8 timer_overlap_warning, __u8 media_info, __u8 prog_info, __u8 prog_error, __u8 duration_hr, __u8 duration_min) { msg->len = 3; msg->msg[1] = CEC_MSG_TIMER_STATUS; msg->msg[2] = (timer_overlap_warning << 7) | (media_info << 5) | (prog_info ? 0x10 : 0) | (prog_info ? prog_info : prog_error); if (prog_info == CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE || prog_info == CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE || prog_error == CEC_OP_PROG_ERROR_DUPLICATE) { msg->len += 2; msg->msg[3] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[4] = ((duration_min / 10) << 4) | (duration_min % 10); } } static __inline__ void cec_ops_timer_status(const struct cec_msg *msg, __u8 *timer_overlap_warning, __u8 *media_info, __u8 *prog_info, __u8 *prog_error, __u8 *duration_hr, __u8 *duration_min) { *timer_overlap_warning = msg->msg[2] >> 7; *media_info = (msg->msg[2] >> 5) & 3; if (msg->msg[2] & 0x10) { *prog_info = msg->msg[2] & 0xf; *prog_error = 0; } else { *prog_info = 0; *prog_error = msg->msg[2] & 0xf; } if (*prog_info == CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE || *prog_info == CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE || *prog_error == CEC_OP_PROG_ERROR_DUPLICATE) { *duration_hr = (msg->msg[3] >> 4) * 10 + (msg->msg[3] & 0xf); *duration_min = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); } else { *duration_hr = *duration_min = 0; } } static __inline__ void cec_msg_timer_cleared_status(struct cec_msg *msg, __u8 timer_cleared_status) { msg->len = 3; msg->msg[1] = CEC_MSG_TIMER_CLEARED_STATUS; msg->msg[2] = timer_cleared_status; } static __inline__ void cec_ops_timer_cleared_status(const struct cec_msg *msg, __u8 *timer_cleared_status) { *timer_cleared_status = msg->msg[2]; } static __inline__ void cec_msg_clear_analogue_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, __u8 ana_bcast_type, __u16 ana_freq, __u8 bcast_system) { msg->len = 13; msg->msg[1] = CEC_MSG_CLEAR_ANALOGUE_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; msg->msg[9] = ana_bcast_type; msg->msg[10] = ana_freq >> 8; msg->msg[11] = ana_freq & 0xff; msg->msg[12] = bcast_system; msg->reply = reply ? CEC_MSG_TIMER_CLEARED_STATUS : 0; } static __inline__ void cec_ops_clear_analogue_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, __u8 *ana_bcast_type, __u16 *ana_freq, __u8 *bcast_system) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; *ana_bcast_type = msg->msg[9]; *ana_freq = (msg->msg[10] << 8) | msg->msg[11]; *bcast_system = msg->msg[12]; } static __inline__ void cec_msg_clear_digital_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, const struct cec_op_digital_service_id *digital) { msg->len = 16; msg->reply = reply ? CEC_MSG_TIMER_CLEARED_STATUS : 0; msg->msg[1] = CEC_MSG_CLEAR_DIGITAL_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; cec_set_digital_service_id(msg->msg + 9, digital); } static __inline__ void cec_ops_clear_digital_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, struct cec_op_digital_service_id *digital) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; cec_get_digital_service_id(msg->msg + 9, digital); } static __inline__ void cec_msg_clear_ext_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, __u8 ext_src_spec, __u8 plug, __u16 phys_addr) { msg->len = 13; msg->msg[1] = CEC_MSG_CLEAR_EXT_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; msg->msg[9] = ext_src_spec; msg->msg[10] = plug; msg->msg[11] = phys_addr >> 8; msg->msg[12] = phys_addr & 0xff; msg->reply = reply ? CEC_MSG_TIMER_CLEARED_STATUS : 0; } static __inline__ void cec_ops_clear_ext_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, __u8 *ext_src_spec, __u8 *plug, __u16 *phys_addr) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; *ext_src_spec = msg->msg[9]; *plug = msg->msg[10]; *phys_addr = (msg->msg[11] << 8) | msg->msg[12]; } static __inline__ void cec_msg_set_analogue_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, __u8 ana_bcast_type, __u16 ana_freq, __u8 bcast_system) { msg->len = 13; msg->msg[1] = CEC_MSG_SET_ANALOGUE_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; msg->msg[9] = ana_bcast_type; msg->msg[10] = ana_freq >> 8; msg->msg[11] = ana_freq & 0xff; msg->msg[12] = bcast_system; msg->reply = reply ? CEC_MSG_TIMER_STATUS : 0; } static __inline__ void cec_ops_set_analogue_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, __u8 *ana_bcast_type, __u16 *ana_freq, __u8 *bcast_system) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; *ana_bcast_type = msg->msg[9]; *ana_freq = (msg->msg[10] << 8) | msg->msg[11]; *bcast_system = msg->msg[12]; } static __inline__ void cec_msg_set_digital_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, const struct cec_op_digital_service_id *digital) { msg->len = 16; msg->reply = reply ? CEC_MSG_TIMER_STATUS : 0; msg->msg[1] = CEC_MSG_SET_DIGITAL_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; cec_set_digital_service_id(msg->msg + 9, digital); } static __inline__ void cec_ops_set_digital_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, struct cec_op_digital_service_id *digital) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; cec_get_digital_service_id(msg->msg + 9, digital); } static __inline__ void cec_msg_set_ext_timer(struct cec_msg *msg, int reply, __u8 day, __u8 month, __u8 start_hr, __u8 start_min, __u8 duration_hr, __u8 duration_min, __u8 recording_seq, __u8 ext_src_spec, __u8 plug, __u16 phys_addr) { msg->len = 13; msg->msg[1] = CEC_MSG_SET_EXT_TIMER; msg->msg[2] = day; msg->msg[3] = month; /* Hours and minutes are in BCD format */ msg->msg[4] = ((start_hr / 10) << 4) | (start_hr % 10); msg->msg[5] = ((start_min / 10) << 4) | (start_min % 10); msg->msg[6] = ((duration_hr / 10) << 4) | (duration_hr % 10); msg->msg[7] = ((duration_min / 10) << 4) | (duration_min % 10); msg->msg[8] = recording_seq; msg->msg[9] = ext_src_spec; msg->msg[10] = plug; msg->msg[11] = phys_addr >> 8; msg->msg[12] = phys_addr & 0xff; msg->reply = reply ? CEC_MSG_TIMER_STATUS : 0; } static __inline__ void cec_ops_set_ext_timer(const struct cec_msg *msg, __u8 *day, __u8 *month, __u8 *start_hr, __u8 *start_min, __u8 *duration_hr, __u8 *duration_min, __u8 *recording_seq, __u8 *ext_src_spec, __u8 *plug, __u16 *phys_addr) { *day = msg->msg[2]; *month = msg->msg[3]; /* Hours and minutes are in BCD format */ *start_hr = (msg->msg[4] >> 4) * 10 + (msg->msg[4] & 0xf); *start_min = (msg->msg[5] >> 4) * 10 + (msg->msg[5] & 0xf); *duration_hr = (msg->msg[6] >> 4) * 10 + (msg->msg[6] & 0xf); *duration_min = (msg->msg[7] >> 4) * 10 + (msg->msg[7] & 0xf); *recording_seq = msg->msg[8]; *ext_src_spec = msg->msg[9]; *plug = msg->msg[10]; *phys_addr = (msg->msg[11] << 8) | msg->msg[12]; } static __inline__ void cec_msg_set_timer_program_title(struct cec_msg *msg, const char *prog_title) { unsigned int len = strlen(prog_title); if (len > 14) len = 14; msg->len = 2 + len; msg->msg[1] = CEC_MSG_SET_TIMER_PROGRAM_TITLE; memcpy(msg->msg + 2, prog_title, len); } static __inline__ void cec_ops_set_timer_program_title(const struct cec_msg *msg, char *prog_title) { unsigned int len = msg->len > 2 ? msg->len - 2 : 0; if (len > 14) len = 14; memcpy(prog_title, msg->msg + 2, len); prog_title[len] = '\0'; } /* System Information Feature */ static __inline__ void cec_msg_cec_version(struct cec_msg *msg, __u8 cec_version) { msg->len = 3; msg->msg[1] = CEC_MSG_CEC_VERSION; msg->msg[2] = cec_version; } static __inline__ void cec_ops_cec_version(const struct cec_msg *msg, __u8 *cec_version) { *cec_version = msg->msg[2]; } static __inline__ void cec_msg_get_cec_version(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GET_CEC_VERSION; msg->reply = reply ? CEC_MSG_CEC_VERSION : 0; } static __inline__ void cec_msg_report_physical_addr(struct cec_msg *msg, __u16 phys_addr, __u8 prim_devtype) { msg->len = 5; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_REPORT_PHYSICAL_ADDR; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; msg->msg[4] = prim_devtype; } static __inline__ void cec_ops_report_physical_addr(const struct cec_msg *msg, __u16 *phys_addr, __u8 *prim_devtype) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *prim_devtype = msg->msg[4]; } static __inline__ void cec_msg_give_physical_addr(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_PHYSICAL_ADDR; msg->reply = reply ? CEC_MSG_REPORT_PHYSICAL_ADDR : 0; } static __inline__ void cec_msg_set_menu_language(struct cec_msg *msg, const char *language) { msg->len = 5; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_SET_MENU_LANGUAGE; memcpy(msg->msg + 2, language, 3); } static __inline__ void cec_ops_set_menu_language(const struct cec_msg *msg, char *language) { memcpy(language, msg->msg + 2, 3); language[3] = '\0'; } static __inline__ void cec_msg_get_menu_language(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GET_MENU_LANGUAGE; msg->reply = reply ? CEC_MSG_SET_MENU_LANGUAGE : 0; } /* * Assumes a single RC Profile byte and a single Device Features byte, * i.e. no extended features are supported by this helper function. * * As of CEC 2.0 no extended features are defined, should those be added * in the future, then this function needs to be adapted or a new function * should be added. */ static __inline__ void cec_msg_report_features(struct cec_msg *msg, __u8 cec_version, __u8 all_device_types, __u8 rc_profile, __u8 dev_features) { msg->len = 6; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_REPORT_FEATURES; msg->msg[2] = cec_version; msg->msg[3] = all_device_types; msg->msg[4] = rc_profile; msg->msg[5] = dev_features; } static __inline__ void cec_ops_report_features(const struct cec_msg *msg, __u8 *cec_version, __u8 *all_device_types, const __u8 **rc_profile, const __u8 **dev_features) { const __u8 *p = &msg->msg[4]; *cec_version = msg->msg[2]; *all_device_types = msg->msg[3]; *rc_profile = p; *dev_features = NULL; while (p < &msg->msg[14] && (*p & CEC_OP_FEAT_EXT)) p++; if (!(*p & CEC_OP_FEAT_EXT)) { *dev_features = p + 1; while (p < &msg->msg[15] && (*p & CEC_OP_FEAT_EXT)) p++; } if (*p & CEC_OP_FEAT_EXT) *rc_profile = *dev_features = NULL; } static __inline__ void cec_msg_give_features(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_FEATURES; msg->reply = reply ? CEC_MSG_REPORT_FEATURES : 0; } /* Deck Control Feature */ static __inline__ void cec_msg_deck_control(struct cec_msg *msg, __u8 deck_control_mode) { msg->len = 3; msg->msg[1] = CEC_MSG_DECK_CONTROL; msg->msg[2] = deck_control_mode; } static __inline__ void cec_ops_deck_control(const struct cec_msg *msg, __u8 *deck_control_mode) { *deck_control_mode = msg->msg[2]; } static __inline__ void cec_msg_deck_status(struct cec_msg *msg, __u8 deck_info) { msg->len = 3; msg->msg[1] = CEC_MSG_DECK_STATUS; msg->msg[2] = deck_info; } static __inline__ void cec_ops_deck_status(const struct cec_msg *msg, __u8 *deck_info) { *deck_info = msg->msg[2]; } static __inline__ void cec_msg_give_deck_status(struct cec_msg *msg, int reply, __u8 status_req) { msg->len = 3; msg->msg[1] = CEC_MSG_GIVE_DECK_STATUS; msg->msg[2] = status_req; msg->reply = reply ? CEC_MSG_DECK_STATUS : 0; } static __inline__ void cec_ops_give_deck_status(const struct cec_msg *msg, __u8 *status_req) { *status_req = msg->msg[2]; } static __inline__ void cec_msg_play(struct cec_msg *msg, __u8 play_mode) { msg->len = 3; msg->msg[1] = CEC_MSG_PLAY; msg->msg[2] = play_mode; } static __inline__ void cec_ops_play(const struct cec_msg *msg, __u8 *play_mode) { *play_mode = msg->msg[2]; } /* Tuner Control Feature */ struct cec_op_tuner_device_info { __u8 rec_flag; __u8 tuner_display_info; __u8 is_analog; union { struct cec_op_digital_service_id digital; struct { __u8 ana_bcast_type; __u16 ana_freq; __u8 bcast_system; } analog; }; }; static __inline__ void cec_msg_tuner_device_status_analog(struct cec_msg *msg, __u8 rec_flag, __u8 tuner_display_info, __u8 ana_bcast_type, __u16 ana_freq, __u8 bcast_system) { msg->len = 7; msg->msg[1] = CEC_MSG_TUNER_DEVICE_STATUS; msg->msg[2] = (rec_flag << 7) | tuner_display_info; msg->msg[3] = ana_bcast_type; msg->msg[4] = ana_freq >> 8; msg->msg[5] = ana_freq & 0xff; msg->msg[6] = bcast_system; } static __inline__ void cec_msg_tuner_device_status_digital(struct cec_msg *msg, __u8 rec_flag, __u8 tuner_display_info, const struct cec_op_digital_service_id *digital) { msg->len = 10; msg->msg[1] = CEC_MSG_TUNER_DEVICE_STATUS; msg->msg[2] = (rec_flag << 7) | tuner_display_info; cec_set_digital_service_id(msg->msg + 3, digital); } static __inline__ void cec_msg_tuner_device_status(struct cec_msg *msg, const struct cec_op_tuner_device_info *tuner_dev_info) { if (tuner_dev_info->is_analog) cec_msg_tuner_device_status_analog(msg, tuner_dev_info->rec_flag, tuner_dev_info->tuner_display_info, tuner_dev_info->analog.ana_bcast_type, tuner_dev_info->analog.ana_freq, tuner_dev_info->analog.bcast_system); else cec_msg_tuner_device_status_digital(msg, tuner_dev_info->rec_flag, tuner_dev_info->tuner_display_info, &tuner_dev_info->digital); } static __inline__ void cec_ops_tuner_device_status(const struct cec_msg *msg, struct cec_op_tuner_device_info *tuner_dev_info) { tuner_dev_info->is_analog = msg->len < 10; tuner_dev_info->rec_flag = msg->msg[2] >> 7; tuner_dev_info->tuner_display_info = msg->msg[2] & 0x7f; if (tuner_dev_info->is_analog) { tuner_dev_info->analog.ana_bcast_type = msg->msg[3]; tuner_dev_info->analog.ana_freq = (msg->msg[4] << 8) | msg->msg[5]; tuner_dev_info->analog.bcast_system = msg->msg[6]; return; } cec_get_digital_service_id(msg->msg + 3, &tuner_dev_info->digital); } static __inline__ void cec_msg_give_tuner_device_status(struct cec_msg *msg, int reply, __u8 status_req) { msg->len = 3; msg->msg[1] = CEC_MSG_GIVE_TUNER_DEVICE_STATUS; msg->msg[2] = status_req; msg->reply = reply ? CEC_MSG_TUNER_DEVICE_STATUS : 0; } static __inline__ void cec_ops_give_tuner_device_status(const struct cec_msg *msg, __u8 *status_req) { *status_req = msg->msg[2]; } static __inline__ void cec_msg_select_analogue_service(struct cec_msg *msg, __u8 ana_bcast_type, __u16 ana_freq, __u8 bcast_system) { msg->len = 6; msg->msg[1] = CEC_MSG_SELECT_ANALOGUE_SERVICE; msg->msg[2] = ana_bcast_type; msg->msg[3] = ana_freq >> 8; msg->msg[4] = ana_freq & 0xff; msg->msg[5] = bcast_system; } static __inline__ void cec_ops_select_analogue_service(const struct cec_msg *msg, __u8 *ana_bcast_type, __u16 *ana_freq, __u8 *bcast_system) { *ana_bcast_type = msg->msg[2]; *ana_freq = (msg->msg[3] << 8) | msg->msg[4]; *bcast_system = msg->msg[5]; } static __inline__ void cec_msg_select_digital_service(struct cec_msg *msg, const struct cec_op_digital_service_id *digital) { msg->len = 9; msg->msg[1] = CEC_MSG_SELECT_DIGITAL_SERVICE; cec_set_digital_service_id(msg->msg + 2, digital); } static __inline__ void cec_ops_select_digital_service(const struct cec_msg *msg, struct cec_op_digital_service_id *digital) { cec_get_digital_service_id(msg->msg + 2, digital); } static __inline__ void cec_msg_tuner_step_decrement(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_TUNER_STEP_DECREMENT; } static __inline__ void cec_msg_tuner_step_increment(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_TUNER_STEP_INCREMENT; } /* Vendor Specific Commands Feature */ static __inline__ void cec_msg_device_vendor_id(struct cec_msg *msg, __u32 vendor_id) { msg->len = 5; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_DEVICE_VENDOR_ID; msg->msg[2] = vendor_id >> 16; msg->msg[3] = (vendor_id >> 8) & 0xff; msg->msg[4] = vendor_id & 0xff; } static __inline__ void cec_ops_device_vendor_id(const struct cec_msg *msg, __u32 *vendor_id) { *vendor_id = (msg->msg[2] << 16) | (msg->msg[3] << 8) | msg->msg[4]; } static __inline__ void cec_msg_give_device_vendor_id(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_DEVICE_VENDOR_ID; msg->reply = reply ? CEC_MSG_DEVICE_VENDOR_ID : 0; } static __inline__ void cec_msg_vendor_command(struct cec_msg *msg, __u8 size, const __u8 *vendor_cmd) { if (size > 14) size = 14; msg->len = 2 + size; msg->msg[1] = CEC_MSG_VENDOR_COMMAND; memcpy(msg->msg + 2, vendor_cmd, size); } static __inline__ void cec_ops_vendor_command(const struct cec_msg *msg, __u8 *size, const __u8 **vendor_cmd) { *size = msg->len - 2; if (*size > 14) *size = 14; *vendor_cmd = msg->msg + 2; } static __inline__ void cec_msg_vendor_command_with_id(struct cec_msg *msg, __u32 vendor_id, __u8 size, const __u8 *vendor_cmd) { if (size > 11) size = 11; msg->len = 5 + size; msg->msg[1] = CEC_MSG_VENDOR_COMMAND_WITH_ID; msg->msg[2] = vendor_id >> 16; msg->msg[3] = (vendor_id >> 8) & 0xff; msg->msg[4] = vendor_id & 0xff; memcpy(msg->msg + 5, vendor_cmd, size); } static __inline__ void cec_ops_vendor_command_with_id(const struct cec_msg *msg, __u32 *vendor_id, __u8 *size, const __u8 **vendor_cmd) { *size = msg->len - 5; if (*size > 11) *size = 11; *vendor_id = (msg->msg[2] << 16) | (msg->msg[3] << 8) | msg->msg[4]; *vendor_cmd = msg->msg + 5; } static __inline__ void cec_msg_vendor_remote_button_down(struct cec_msg *msg, __u8 size, const __u8 *rc_code) { if (size > 14) size = 14; msg->len = 2 + size; msg->msg[1] = CEC_MSG_VENDOR_REMOTE_BUTTON_DOWN; memcpy(msg->msg + 2, rc_code, size); } static __inline__ void cec_ops_vendor_remote_button_down(const struct cec_msg *msg, __u8 *size, const __u8 **rc_code) { *size = msg->len - 2; if (*size > 14) *size = 14; *rc_code = msg->msg + 2; } static __inline__ void cec_msg_vendor_remote_button_up(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_VENDOR_REMOTE_BUTTON_UP; } /* OSD Display Feature */ static __inline__ void cec_msg_set_osd_string(struct cec_msg *msg, __u8 disp_ctl, const char *osd) { unsigned int len = strlen(osd); if (len > 13) len = 13; msg->len = 3 + len; msg->msg[1] = CEC_MSG_SET_OSD_STRING; msg->msg[2] = disp_ctl; memcpy(msg->msg + 3, osd, len); } static __inline__ void cec_ops_set_osd_string(const struct cec_msg *msg, __u8 *disp_ctl, char *osd) { unsigned int len = msg->len > 3 ? msg->len - 3 : 0; *disp_ctl = msg->msg[2]; if (len > 13) len = 13; memcpy(osd, msg->msg + 3, len); osd[len] = '\0'; } /* Device OSD Transfer Feature */ static __inline__ void cec_msg_set_osd_name(struct cec_msg *msg, const char *name) { unsigned int len = strlen(name); if (len > 14) len = 14; msg->len = 2 + len; msg->msg[1] = CEC_MSG_SET_OSD_NAME; memcpy(msg->msg + 2, name, len); } static __inline__ void cec_ops_set_osd_name(const struct cec_msg *msg, char *name) { unsigned int len = msg->len > 2 ? msg->len - 2 : 0; if (len > 14) len = 14; memcpy(name, msg->msg + 2, len); name[len] = '\0'; } static __inline__ void cec_msg_give_osd_name(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_OSD_NAME; msg->reply = reply ? CEC_MSG_SET_OSD_NAME : 0; } /* Device Menu Control Feature */ static __inline__ void cec_msg_menu_status(struct cec_msg *msg, __u8 menu_state) { msg->len = 3; msg->msg[1] = CEC_MSG_MENU_STATUS; msg->msg[2] = menu_state; } static __inline__ void cec_ops_menu_status(const struct cec_msg *msg, __u8 *menu_state) { *menu_state = msg->msg[2]; } static __inline__ void cec_msg_menu_request(struct cec_msg *msg, int reply, __u8 menu_req) { msg->len = 3; msg->msg[1] = CEC_MSG_MENU_REQUEST; msg->msg[2] = menu_req; msg->reply = reply ? CEC_MSG_MENU_STATUS : 0; } static __inline__ void cec_ops_menu_request(const struct cec_msg *msg, __u8 *menu_req) { *menu_req = msg->msg[2]; } struct cec_op_ui_command { __u8 ui_cmd; __u8 has_opt_arg; union { struct cec_op_channel_data channel_identifier; __u8 ui_broadcast_type; __u8 ui_sound_presentation_control; __u8 play_mode; __u8 ui_function_media; __u8 ui_function_select_av_input; __u8 ui_function_select_audio_input; }; }; static __inline__ void cec_msg_user_control_pressed(struct cec_msg *msg, const struct cec_op_ui_command *ui_cmd) { msg->len = 3; msg->msg[1] = CEC_MSG_USER_CONTROL_PRESSED; msg->msg[2] = ui_cmd->ui_cmd; if (!ui_cmd->has_opt_arg) return; switch (ui_cmd->ui_cmd) { case 0x56: case 0x57: case 0x60: case 0x68: case 0x69: case 0x6a: /* The optional operand is one byte for all these ui commands */ msg->len++; msg->msg[3] = ui_cmd->play_mode; break; case 0x67: msg->len += 4; msg->msg[3] = (ui_cmd->channel_identifier.channel_number_fmt << 2) | (ui_cmd->channel_identifier.major >> 8); msg->msg[4] = ui_cmd->channel_identifier.major & 0xff; msg->msg[5] = ui_cmd->channel_identifier.minor >> 8; msg->msg[6] = ui_cmd->channel_identifier.minor & 0xff; break; } } static __inline__ void cec_ops_user_control_pressed(const struct cec_msg *msg, struct cec_op_ui_command *ui_cmd) { ui_cmd->ui_cmd = msg->msg[2]; ui_cmd->has_opt_arg = 0; if (msg->len == 3) return; switch (ui_cmd->ui_cmd) { case 0x56: case 0x57: case 0x60: case 0x68: case 0x69: case 0x6a: /* The optional operand is one byte for all these ui commands */ ui_cmd->play_mode = msg->msg[3]; ui_cmd->has_opt_arg = 1; break; case 0x67: if (msg->len < 7) break; ui_cmd->has_opt_arg = 1; ui_cmd->channel_identifier.channel_number_fmt = msg->msg[3] >> 2; ui_cmd->channel_identifier.major = ((msg->msg[3] & 3) << 6) | msg->msg[4]; ui_cmd->channel_identifier.minor = (msg->msg[5] << 8) | msg->msg[6]; break; } } static __inline__ void cec_msg_user_control_released(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_USER_CONTROL_RELEASED; } /* Remote Control Passthrough Feature */ /* Power Status Feature */ static __inline__ void cec_msg_report_power_status(struct cec_msg *msg, __u8 pwr_state) { msg->len = 3; msg->msg[1] = CEC_MSG_REPORT_POWER_STATUS; msg->msg[2] = pwr_state; } static __inline__ void cec_ops_report_power_status(const struct cec_msg *msg, __u8 *pwr_state) { *pwr_state = msg->msg[2]; } static __inline__ void cec_msg_give_device_power_status(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_DEVICE_POWER_STATUS; msg->reply = reply ? CEC_MSG_REPORT_POWER_STATUS : 0; } /* General Protocol Messages */ static __inline__ void cec_msg_feature_abort(struct cec_msg *msg, __u8 abort_msg, __u8 reason) { msg->len = 4; msg->msg[1] = CEC_MSG_FEATURE_ABORT; msg->msg[2] = abort_msg; msg->msg[3] = reason; } static __inline__ void cec_ops_feature_abort(const struct cec_msg *msg, __u8 *abort_msg, __u8 *reason) { *abort_msg = msg->msg[2]; *reason = msg->msg[3]; } /* This changes the current message into a feature abort message */ static __inline__ void cec_msg_reply_feature_abort(struct cec_msg *msg, __u8 reason) { cec_msg_set_reply_to(msg, msg); msg->len = 4; msg->msg[2] = msg->msg[1]; msg->msg[3] = reason; msg->msg[1] = CEC_MSG_FEATURE_ABORT; } static __inline__ void cec_msg_abort(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_ABORT; } /* System Audio Control Feature */ static __inline__ void cec_msg_report_audio_status(struct cec_msg *msg, __u8 aud_mute_status, __u8 aud_vol_status) { msg->len = 3; msg->msg[1] = CEC_MSG_REPORT_AUDIO_STATUS; msg->msg[2] = (aud_mute_status << 7) | (aud_vol_status & 0x7f); } static __inline__ void cec_ops_report_audio_status(const struct cec_msg *msg, __u8 *aud_mute_status, __u8 *aud_vol_status) { *aud_mute_status = msg->msg[2] >> 7; *aud_vol_status = msg->msg[2] & 0x7f; } static __inline__ void cec_msg_give_audio_status(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_AUDIO_STATUS; msg->reply = reply ? CEC_MSG_REPORT_AUDIO_STATUS : 0; } static __inline__ void cec_msg_set_system_audio_mode(struct cec_msg *msg, __u8 sys_aud_status) { msg->len = 3; msg->msg[1] = CEC_MSG_SET_SYSTEM_AUDIO_MODE; msg->msg[2] = sys_aud_status; } static __inline__ void cec_ops_set_system_audio_mode(const struct cec_msg *msg, __u8 *sys_aud_status) { *sys_aud_status = msg->msg[2]; } static __inline__ void cec_msg_system_audio_mode_request(struct cec_msg *msg, int reply, __u16 phys_addr) { msg->len = phys_addr == 0xffff ? 2 : 4; msg->msg[1] = CEC_MSG_SYSTEM_AUDIO_MODE_REQUEST; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; msg->reply = reply ? CEC_MSG_SET_SYSTEM_AUDIO_MODE : 0; } static __inline__ void cec_ops_system_audio_mode_request(const struct cec_msg *msg, __u16 *phys_addr) { if (msg->len < 4) *phys_addr = 0xffff; else *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_system_audio_mode_status(struct cec_msg *msg, __u8 sys_aud_status) { msg->len = 3; msg->msg[1] = CEC_MSG_SYSTEM_AUDIO_MODE_STATUS; msg->msg[2] = sys_aud_status; } static __inline__ void cec_ops_system_audio_mode_status(const struct cec_msg *msg, __u8 *sys_aud_status) { *sys_aud_status = msg->msg[2]; } static __inline__ void cec_msg_give_system_audio_mode_status(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_GIVE_SYSTEM_AUDIO_MODE_STATUS; msg->reply = reply ? CEC_MSG_SYSTEM_AUDIO_MODE_STATUS : 0; } static __inline__ void cec_msg_report_short_audio_descriptor(struct cec_msg *msg, __u8 num_descriptors, const __u32 *descriptors) { unsigned int i; if (num_descriptors > 4) num_descriptors = 4; msg->len = 2 + num_descriptors * 3; msg->msg[1] = CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR; for (i = 0; i < num_descriptors; i++) { msg->msg[2 + i * 3] = (descriptors[i] >> 16) & 0xff; msg->msg[3 + i * 3] = (descriptors[i] >> 8) & 0xff; msg->msg[4 + i * 3] = descriptors[i] & 0xff; } } static __inline__ void cec_ops_report_short_audio_descriptor(const struct cec_msg *msg, __u8 *num_descriptors, __u32 *descriptors) { unsigned int i; *num_descriptors = (msg->len - 2) / 3; if (*num_descriptors > 4) *num_descriptors = 4; for (i = 0; i < *num_descriptors; i++) descriptors[i] = (msg->msg[2 + i * 3] << 16) | (msg->msg[3 + i * 3] << 8) | msg->msg[4 + i * 3]; } static __inline__ void cec_msg_request_short_audio_descriptor(struct cec_msg *msg, int reply, __u8 num_descriptors, const __u8 *audio_format_id, const __u8 *audio_format_code) { unsigned int i; if (num_descriptors > 4) num_descriptors = 4; msg->len = 2 + num_descriptors; msg->msg[1] = CEC_MSG_REQUEST_SHORT_AUDIO_DESCRIPTOR; msg->reply = reply ? CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR : 0; for (i = 0; i < num_descriptors; i++) msg->msg[2 + i] = (audio_format_id[i] << 6) | (audio_format_code[i] & 0x3f); } static __inline__ void cec_ops_request_short_audio_descriptor(const struct cec_msg *msg, __u8 *num_descriptors, __u8 *audio_format_id, __u8 *audio_format_code) { unsigned int i; *num_descriptors = msg->len - 2; if (*num_descriptors > 4) *num_descriptors = 4; for (i = 0; i < *num_descriptors; i++) { audio_format_id[i] = msg->msg[2 + i] >> 6; audio_format_code[i] = msg->msg[2 + i] & 0x3f; } } static __inline__ void cec_msg_set_audio_volume_level(struct cec_msg *msg, __u8 audio_volume_level) { msg->len = 3; msg->msg[1] = CEC_MSG_SET_AUDIO_VOLUME_LEVEL; msg->msg[2] = audio_volume_level; } static __inline__ void cec_ops_set_audio_volume_level(const struct cec_msg *msg, __u8 *audio_volume_level) { *audio_volume_level = msg->msg[2]; } /* Audio Rate Control Feature */ static __inline__ void cec_msg_set_audio_rate(struct cec_msg *msg, __u8 audio_rate) { msg->len = 3; msg->msg[1] = CEC_MSG_SET_AUDIO_RATE; msg->msg[2] = audio_rate; } static __inline__ void cec_ops_set_audio_rate(const struct cec_msg *msg, __u8 *audio_rate) { *audio_rate = msg->msg[2]; } /* Audio Return Channel Control Feature */ static __inline__ void cec_msg_report_arc_initiated(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_REPORT_ARC_INITIATED; } static __inline__ void cec_msg_initiate_arc(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_INITIATE_ARC; msg->reply = reply ? CEC_MSG_REPORT_ARC_INITIATED : 0; } static __inline__ void cec_msg_request_arc_initiation(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_REQUEST_ARC_INITIATION; msg->reply = reply ? CEC_MSG_INITIATE_ARC : 0; } static __inline__ void cec_msg_report_arc_terminated(struct cec_msg *msg) { msg->len = 2; msg->msg[1] = CEC_MSG_REPORT_ARC_TERMINATED; } static __inline__ void cec_msg_terminate_arc(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_TERMINATE_ARC; msg->reply = reply ? CEC_MSG_REPORT_ARC_TERMINATED : 0; } static __inline__ void cec_msg_request_arc_termination(struct cec_msg *msg, int reply) { msg->len = 2; msg->msg[1] = CEC_MSG_REQUEST_ARC_TERMINATION; msg->reply = reply ? CEC_MSG_TERMINATE_ARC : 0; } /* Dynamic Audio Lipsync Feature */ /* Only for CEC 2.0 and up */ static __inline__ void cec_msg_report_current_latency(struct cec_msg *msg, __u16 phys_addr, __u8 video_latency, __u8 low_latency_mode, __u8 audio_out_compensated, __u8 audio_out_delay) { msg->len = 6; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_REPORT_CURRENT_LATENCY; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; msg->msg[4] = video_latency; msg->msg[5] = (low_latency_mode << 2) | audio_out_compensated; if (audio_out_compensated == 3) msg->msg[msg->len++] = audio_out_delay; } static __inline__ void cec_ops_report_current_latency(const struct cec_msg *msg, __u16 *phys_addr, __u8 *video_latency, __u8 *low_latency_mode, __u8 *audio_out_compensated, __u8 *audio_out_delay) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *video_latency = msg->msg[4]; *low_latency_mode = (msg->msg[5] >> 2) & 1; *audio_out_compensated = msg->msg[5] & 3; if (*audio_out_compensated == 3 && msg->len >= 7) *audio_out_delay = msg->msg[6]; else *audio_out_delay = 0; } static __inline__ void cec_msg_request_current_latency(struct cec_msg *msg, int reply, __u16 phys_addr) { msg->len = 4; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_REQUEST_CURRENT_LATENCY; msg->msg[2] = phys_addr >> 8; msg->msg[3] = phys_addr & 0xff; msg->reply = reply ? CEC_MSG_REPORT_CURRENT_LATENCY : 0; } static __inline__ void cec_ops_request_current_latency(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } /* Capability Discovery and Control Feature */ static __inline__ void cec_msg_cdc_hec_inquire_state(struct cec_msg *msg, __u16 phys_addr1, __u16 phys_addr2) { msg->len = 9; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_INQUIRE_STATE; msg->msg[5] = phys_addr1 >> 8; msg->msg[6] = phys_addr1 & 0xff; msg->msg[7] = phys_addr2 >> 8; msg->msg[8] = phys_addr2 & 0xff; } static __inline__ void cec_ops_cdc_hec_inquire_state(const struct cec_msg *msg, __u16 *phys_addr, __u16 *phys_addr1, __u16 *phys_addr2) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *phys_addr1 = (msg->msg[5] << 8) | msg->msg[6]; *phys_addr2 = (msg->msg[7] << 8) | msg->msg[8]; } static __inline__ void cec_msg_cdc_hec_report_state(struct cec_msg *msg, __u16 target_phys_addr, __u8 hec_func_state, __u8 host_func_state, __u8 enc_func_state, __u8 cdc_errcode, __u8 has_field, __u16 hec_field) { msg->len = has_field ? 10 : 8; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_REPORT_STATE; msg->msg[5] = target_phys_addr >> 8; msg->msg[6] = target_phys_addr & 0xff; msg->msg[7] = (hec_func_state << 6) | (host_func_state << 4) | (enc_func_state << 2) | cdc_errcode; if (has_field) { msg->msg[8] = hec_field >> 8; msg->msg[9] = hec_field & 0xff; } } static __inline__ void cec_ops_cdc_hec_report_state(const struct cec_msg *msg, __u16 *phys_addr, __u16 *target_phys_addr, __u8 *hec_func_state, __u8 *host_func_state, __u8 *enc_func_state, __u8 *cdc_errcode, __u8 *has_field, __u16 *hec_field) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *target_phys_addr = (msg->msg[5] << 8) | msg->msg[6]; *hec_func_state = msg->msg[7] >> 6; *host_func_state = (msg->msg[7] >> 4) & 3; *enc_func_state = (msg->msg[7] >> 4) & 3; *cdc_errcode = msg->msg[7] & 3; *has_field = msg->len >= 10; *hec_field = *has_field ? ((msg->msg[8] << 8) | msg->msg[9]) : 0; } static __inline__ void cec_msg_cdc_hec_set_state(struct cec_msg *msg, __u16 phys_addr1, __u16 phys_addr2, __u8 hec_set_state, __u16 phys_addr3, __u16 phys_addr4, __u16 phys_addr5) { msg->len = 10; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_INQUIRE_STATE; msg->msg[5] = phys_addr1 >> 8; msg->msg[6] = phys_addr1 & 0xff; msg->msg[7] = phys_addr2 >> 8; msg->msg[8] = phys_addr2 & 0xff; msg->msg[9] = hec_set_state; if (phys_addr3 != CEC_PHYS_ADDR_INVALID) { msg->msg[msg->len++] = phys_addr3 >> 8; msg->msg[msg->len++] = phys_addr3 & 0xff; if (phys_addr4 != CEC_PHYS_ADDR_INVALID) { msg->msg[msg->len++] = phys_addr4 >> 8; msg->msg[msg->len++] = phys_addr4 & 0xff; if (phys_addr5 != CEC_PHYS_ADDR_INVALID) { msg->msg[msg->len++] = phys_addr5 >> 8; msg->msg[msg->len++] = phys_addr5 & 0xff; } } } } static __inline__ void cec_ops_cdc_hec_set_state(const struct cec_msg *msg, __u16 *phys_addr, __u16 *phys_addr1, __u16 *phys_addr2, __u8 *hec_set_state, __u16 *phys_addr3, __u16 *phys_addr4, __u16 *phys_addr5) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *phys_addr1 = (msg->msg[5] << 8) | msg->msg[6]; *phys_addr2 = (msg->msg[7] << 8) | msg->msg[8]; *hec_set_state = msg->msg[9]; *phys_addr3 = *phys_addr4 = *phys_addr5 = CEC_PHYS_ADDR_INVALID; if (msg->len >= 12) *phys_addr3 = (msg->msg[10] << 8) | msg->msg[11]; if (msg->len >= 14) *phys_addr4 = (msg->msg[12] << 8) | msg->msg[13]; if (msg->len >= 16) *phys_addr5 = (msg->msg[14] << 8) | msg->msg[15]; } static __inline__ void cec_msg_cdc_hec_set_state_adjacent(struct cec_msg *msg, __u16 phys_addr1, __u8 hec_set_state) { msg->len = 8; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_SET_STATE_ADJACENT; msg->msg[5] = phys_addr1 >> 8; msg->msg[6] = phys_addr1 & 0xff; msg->msg[7] = hec_set_state; } static __inline__ void cec_ops_cdc_hec_set_state_adjacent(const struct cec_msg *msg, __u16 *phys_addr, __u16 *phys_addr1, __u8 *hec_set_state) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *phys_addr1 = (msg->msg[5] << 8) | msg->msg[6]; *hec_set_state = msg->msg[7]; } static __inline__ void cec_msg_cdc_hec_request_deactivation(struct cec_msg *msg, __u16 phys_addr1, __u16 phys_addr2, __u16 phys_addr3) { msg->len = 11; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_REQUEST_DEACTIVATION; msg->msg[5] = phys_addr1 >> 8; msg->msg[6] = phys_addr1 & 0xff; msg->msg[7] = phys_addr2 >> 8; msg->msg[8] = phys_addr2 & 0xff; msg->msg[9] = phys_addr3 >> 8; msg->msg[10] = phys_addr3 & 0xff; } static __inline__ void cec_ops_cdc_hec_request_deactivation(const struct cec_msg *msg, __u16 *phys_addr, __u16 *phys_addr1, __u16 *phys_addr2, __u16 *phys_addr3) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *phys_addr1 = (msg->msg[5] << 8) | msg->msg[6]; *phys_addr2 = (msg->msg[7] << 8) | msg->msg[8]; *phys_addr3 = (msg->msg[9] << 8) | msg->msg[10]; } static __inline__ void cec_msg_cdc_hec_notify_alive(struct cec_msg *msg) { msg->len = 5; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_NOTIFY_ALIVE; } static __inline__ void cec_ops_cdc_hec_notify_alive(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_cdc_hec_discover(struct cec_msg *msg) { msg->len = 5; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HEC_DISCOVER; } static __inline__ void cec_ops_cdc_hec_discover(const struct cec_msg *msg, __u16 *phys_addr) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; } static __inline__ void cec_msg_cdc_hpd_set_state(struct cec_msg *msg, __u8 input_port, __u8 hpd_state) { msg->len = 6; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HPD_SET_STATE; msg->msg[5] = (input_port << 4) | hpd_state; } static __inline__ void cec_ops_cdc_hpd_set_state(const struct cec_msg *msg, __u16 *phys_addr, __u8 *input_port, __u8 *hpd_state) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *input_port = msg->msg[5] >> 4; *hpd_state = msg->msg[5] & 0xf; } static __inline__ void cec_msg_cdc_hpd_report_state(struct cec_msg *msg, __u8 hpd_state, __u8 hpd_error) { msg->len = 6; msg->msg[0] |= 0xf; /* broadcast */ msg->msg[1] = CEC_MSG_CDC_MESSAGE; /* msg[2] and msg[3] (phys_addr) are filled in by the CEC framework */ msg->msg[4] = CEC_MSG_CDC_HPD_REPORT_STATE; msg->msg[5] = (hpd_state << 4) | hpd_error; } static __inline__ void cec_ops_cdc_hpd_report_state(const struct cec_msg *msg, __u16 *phys_addr, __u8 *hpd_state, __u8 *hpd_error) { *phys_addr = (msg->msg[2] << 8) | msg->msg[3]; *hpd_state = msg->msg[5] >> 4; *hpd_error = msg->msg[5] & 0xf; } #endif
Save