tools/testing/selftests/ir/ir_loopback.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/ir/ir_loopback.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/ir/ir_loopback.c- Extension
.c- Size
- 5714 bytes
- Lines
- 220
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/lirc.herrno.hstdio.hstdlib.hstdbool.hstring.hunistd.hpoll.htime.hsys/types.hsys/ioctl.hdirent.hsys/stat.hfcntl.hkselftest.h
Detected Declarations
function lirc_openfunction main
Annotated Snippet
if (!strncmp(dent->d_name, "lirc", 4)) {
snprintf(buf, sizeof(buf), "/dev/%s", dent->d_name);
break;
}
}
if (!dent)
ksft_exit_skip("cannot find lirc device for %s\n", rc);
closedir(d);
fd = open(buf, O_RDWR | O_NONBLOCK);
if (fd == -1)
ksft_exit_fail_msg("cannot open: %s: %m\n", buf);
return fd;
}
int main(int argc, char **argv)
{
unsigned int mode;
char buf[100];
int rlircfd, wlircfd, protocolfd, i, n;
srand(time(NULL));
if (argc != 3)
ksft_exit_fail_msg("Usage: %s <write rcN> <read rcN>\n",
argv[0]);
rlircfd = lirc_open(argv[2]);
mode = LIRC_MODE_SCANCODE;
if (ioctl(rlircfd, LIRC_SET_REC_MODE, &mode))
ksft_exit_fail_msg("failed to set scancode rec mode %s: %m\n",
argv[2]);
wlircfd = lirc_open(argv[1]);
if (ioctl(wlircfd, LIRC_SET_SEND_MODE, &mode))
ksft_exit_fail_msg("failed to set scancode send mode %s: %m\n",
argv[1]);
snprintf(buf, sizeof(buf), "/sys/class/rc/%s/protocols", argv[2]);
protocolfd = open(buf, O_WRONLY);
if (protocolfd == -1)
ksft_exit_fail_msg("failed to open %s: %m\n", buf);
printf("Sending IR on %s and receiving IR on %s.\n", argv[1], argv[2]);
for (i = 0; i < ARRAY_SIZE(protocols); i++) {
if (write(protocolfd, protocols[i].decoder,
strlen(protocols[i].decoder)) == -1)
ksft_exit_fail_msg("failed to set write decoder\n");
printf("Testing protocol %s for decoder %s (%d/%d)...\n",
protocols[i].name, protocols[i].decoder,
i + 1, (int)ARRAY_SIZE(protocols));
for (n = 0; n < TEST_SCANCODES; n++) {
unsigned int scancode = rand() & protocols[i].mask;
unsigned int rc_proto = protocols[i].proto;
if (rc_proto == RC_PROTO_RC6_MCE)
scancode |= 0x800f0000;
if (rc_proto == RC_PROTO_NECX &&
(((scancode >> 16) ^ ~(scancode >> 8)) & 0xff) == 0)
continue;
if (rc_proto == RC_PROTO_NEC32 &&
(((scancode >> 8) ^ ~scancode) & 0xff) == 0)
continue;
if (rc_proto == RC_PROTO_RCMM32 &&
(scancode & 0x000c0000) != 0x000c0000 &&
scancode & 0x00008000)
continue;
struct lirc_scancode lsc = {
.rc_proto = rc_proto,
.scancode = scancode
};
printf("Testing scancode:%x\n", scancode);
while (write(wlircfd, &lsc, sizeof(lsc)) < 0) {
if (errno == EINTR)
continue;
ksft_exit_fail_msg("failed to send ir: %m\n");
}
Annotation
- Immediate include surface: `linux/lirc.h`, `errno.h`, `stdio.h`, `stdlib.h`, `stdbool.h`, `string.h`, `unistd.h`, `poll.h`.
- Detected declarations: `function lirc_open`, `function main`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.