📄 test7121.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <linux/videodev.h>
#include <linux/video_encoder.h>
#define PHSTBFB_IOCTL_BASE 0xF0
#define PH_STBFB_GET_RENDERERID _IOR(PHSTBFB_IOCTL_BASE,0,__u32)
#define ENCODER_SET_REG _IOW('e',10,int)
#define ENCODER_GET_REG _IOWR('e',11,int)
typedef enum outputMode{
PAL,
NTSC,
}outputMode;
typedef enum outputStatus{
OFF,
ON,
}outputStatus;
int setStatus=0;
int setMode =0;
int readReg = 0;
int setReg = 0;
outputMode saa7121_OutPut_Mode;
outputStatus saa7121_OutPut_Status;
static void printHelp(const char *appName)
{
printf("%s : Set saa7121h register function.\n",appName);
printf("Optoins:\n");
printf(" -h show this screen\n");
printf(" -s <register> [value] set/read register value.\n" );
printf(" <register> range : 0x00 ~ 0x7f.\n");
printf(" [value] range : 0x00 ~ 0x7f.\n");
printf(" -o <pal | ntsc> set output mode.\n");
printf(" -e <on | off> set output status.\n");
}
/*
unsigned long strtoul(const char *str, char **endptr, int requestedbase, int *ret)
{
unsigned long num = 0;
char c;
__u8 digit;
int base = 10;
int nchars = 0;
int leadingZero = 0;
*ret = 0;
while ((c = *str) != 0) {
if (nchars == 0 && c == '0') {
leadingZero = 1;
printf("strtoul(): leadingZero nchar=%d", nchars);
goto step;
} else if (leadingZero && nchars == 1) {
if (c == 'x') {
base = 16;
printf("strtoul(): base 16 nchars=%d", nchars);
goto step;
} else if (c == 'o') {
base = 8;
printf("strtoul(): base8 nchars=%d", nchars);
goto step;
}
}
printf("strtoul: c=%c", c);
if (c >= '0' && c <= '9') {
digit = c - '0';
} else if (c >= 'a' && c <= 'z') {
digit = c - 'a' + 10;
} else if (c >= 'A' && c <= 'Z') {
digit = c - 'A' + 10;
} else {
*ret = 3;
return 0;
}
if (digit >= base) {
*ret = 4;
return 0;
}
num *= base;
num += digit;
step:
str++;
nchars++;
}
return num;
}
*/
int main(int argc, char** argv)
{
int fb=0;
int i = 0;
int reg = -1;
int value = -1;
unsigned long setting = 0;
fb = open("/dev/saa7121",O_RDONLY);
if( fb<0){
printf("open /dev/saa7121 error!\n");
return 1;
}
if (argc == 1 || (strcmp(argv[1], "-h") == 0))
{
printHelp(argv[0]);
return 0;
}
for (i=1; i<argc; i++) {
if (strcmp(argv[i], "-s") == 0){
if ((i+1) < argc ){
reg = strtoul(argv[i+1],NULL,0);
readReg = 1;
setReg = 0;
if (((i+2) < argc)){
value = strtoul(argv[i+2],NULL,0);
setReg = 1;
readReg = 0;
}
}else{
printHelp(argv[0]);
return 1;
}
}
if (strcmp(argv[i], "-o") == 0){
if ((i+1) < argc){
switch ( argv[i+1][0]){
case 'p':
saa7121_OutPut_Mode = PAL;
break;
case 'n':
saa7121_OutPut_Mode = NTSC;
break;
default:
printHelp(argv[0]);
return 1;
}
setMode = 1;
}else{
printHelp(argv[0]);
return 1;
}
}
if (strcmp(argv[i], "-e") == 0){
if ((i+1) < argc){
switch ( argv[i+1][1]){
case 'n':
saa7121_OutPut_Status = ON;
break;
case 'f':
saa7121_OutPut_Mode = OFF;
break;
default:
printHelp(argv[0]);
return 1;
}
setStatus = 1;
}else{
printHelp(argv[0]);
return 1;
}
}
}
if (!(setReg || readReg || setStatus|| setMode)){
printHelp(argv[0]);
return 1; }
if (setReg || readReg){
if (reg < 0 || reg > 0xff)
{
printf("Error register address %x! (0x00~0x7f) \n", reg);
printHelp(argv[0]);
return 1;
}
}
if (setReg)
{
if (value < 0 || value > 0xff)
{
printf("Errer register value! (0x00~0xff)\n");
return 1;
}
setting = (reg & 0xff) << 8 | (value & 0xff);
printf("send setting value : 0x%08x\n", setting);
if (ioctl(fb, ENCODER_SET_REG,&setting) < 0){
printf("Error set saa7121 register 0x%02x \n", reg);
return 1;
}
printf("Set saa7121 register 0x%02x = 0x%02x.\n", reg,value);
return 0;
}
if (readReg){
reg = reg & 0xff;
setting = reg & 0xff;
if (ioctl(fb, ENCODER_GET_REG,&setting ) < 0){
printf("Error read saa7121 register 0x%02x \n", reg);
return 1;
}
printf("Read saa7121 register at 0x%02x, value = 0x%02x.\n", reg,setting);
return 0;
}
if (setMode){
if (saa7121_OutPut_Mode == NTSC)
setting = VIDEO_MODE_NTSC;
else
setting = VIDEO_MODE_PAL;
if (ioctl(fb, ENCODER_SET_NORM,&setting ) < 0){
printf("Error set saa7121 output mode \n");
return 1;
}
return 0;
}
if (setStatus){
if (saa7121_OutPut_Status == ON)
setting = 1;
else
setting = 0;
if (ioctl(fb, ENCODER_ENABLE_OUTPUT,&setting ) < 0){
printf("Error set saa7121 power status\n");
return 1;
}
return 0;
}
return 0;
/*
opterr = 0;
while ((c = getopt(argc, argv, ":r:v:h")) > 0);
{
switch (c)
{
case 'h':
printHelp(argv[0]);
break;
case 'r':
printf("option r:'%s'\n",optarg);
reg = atoi(optarg);
break;
case 'v':
printf("option v:'%s'\n",optarg);
value = atoi(optarg);
readval = 0;
break;
default:
printf( "%s: Unrecognised option -- %c\n", argv[0], optopt);
break;
}
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -