/* SPDX-License-Identifier: GPL-2.0 */
/*
* Header file for the compaq Micro MFD
*/
#ifndef _MFD_IPAQ_MICRO_H_
#define _MFD_IPAQ_MICRO_H_
#include <linux/spinlock.h>
#include <linux/completion.h>
#include <linux/list.h>
#define TX_BUF_SIZE 32
#define RX_BUF_SIZE 16
#define CHAR_SOF 0 x02
/*
* These are the different messages that can be sent to the microcontroller
* to control various aspects .
*/
#define MSG_VERSION 0 x0
#define MSG_KEYBOARD 0 x2
#define MSG_TOUCHSCREEN 0 x3
#define MSG_EEPROM_READ 0 x4
#define MSG_EEPROM_WRITE 0 x5
#define MSG_THERMAL_SENSOR 0 x6
#define MSG_NOTIFY_LED 0 x8
#define MSG_BATTERY 0 x9
#define MSG_SPI_READ 0 xb
#define MSG_SPI_WRITE 0 xc
#define MSG_BACKLIGHT 0 xd /* H3600 only */
#define MSG_CODEC_CTRL 0 xe /* H3100 only */
#define MSG_DISPLAY_CTRL 0 xf /* H3100 only */
/* state of receiver parser */
enum rx_state {
STATE_SOF = 0 , /* Next byte should be start of frame */
STATE_ID, /* Next byte is ID & message length */
STATE_DATA, /* Next byte is a data byte */
STATE_CHKSUM /* Next byte should be checksum */
};
/**
* struct ipaq_micro_txdev - TX state
* @ len : length of message in TX buffer
* @ index : current index into TX buffer
* @ buf : TX buffer
*/
struct ipaq_micro_txdev {
u8 len;
u8 index;
u8 buf[TX_BUF_SIZE];
};
/**
* struct ipaq_micro_rxdev - RX state
* @ state : context of RX state machine
* @ chksum : calculated checksum
* @ id : message ID from packet
* @ len : RX buffer length
* @ index : RX buffer index
* @ buf : RX buffer
*/
struct ipaq_micro_rxdev {
enum rx_state state;
unsigned char chksum;
u8 id;
unsigned int len;
unsigned int index;
u8 buf[RX_BUF_SIZE];
};
/**
* struct ipaq_micro_msg - message to the iPAQ microcontroller
* @ id : 4 - bit ID of the message
* @ tx_len : length of TX data
* @ tx_data : TX data to send
* @ rx_len : length of received RX data
* @ rx_data : RX data to receive
* @ ack : a completion that will be completed when RX is complete
* @ node : list node if message gets queued
*/
struct ipaq_micro_msg {
u8 id;
u8 tx_len;
u8 tx_data[TX_BUF_SIZE];
u8 rx_len;
u8 rx_data[RX_BUF_SIZE];
struct completion ack;
struct list_head node;
};
/**
* struct ipaq_micro - iPAQ microcontroller state
* @ dev : corresponding platform device
* @ base : virtual memory base for underlying serial device
* @ sdlc : virtual memory base for Synchronous Data Link Controller
* @ version : version string
* @ tx : TX state
* @ rx : RX state
* @ lock : lock for this state container
* @ msg : current message
* @ queue : message queue
* @ key : callback for asynchronous key events
* @ key_data : data to pass along with key events
* @ ts : callback for asynchronous touchscreen events
* @ ts_data : data to pass along with key events
*/
struct ipaq_micro {
struct device *dev;
void __iomem *base;
void __iomem *sdlc;
char version[5 ];
struct ipaq_micro_txdev tx; /* transmit ISR state */
struct ipaq_micro_rxdev rx; /* receive ISR state */
spinlock_t lock;
struct ipaq_micro_msg *msg;
struct list_head queue;
void (*key) (void *data, int len, unsigned char *rxdata);
void *key_data;
void (*ts) (void *data, int len, unsigned char *rxdata);
void *ts_data;
};
extern int
ipaq_micro_tx_msg(struct ipaq_micro *micro, struct ipaq_micro_msg *msg);
static inline int
ipaq_micro_tx_msg_sync(struct ipaq_micro *micro,
struct ipaq_micro_msg *msg)
{
int ret;
init_completion(&msg->ack);
ret = ipaq_micro_tx_msg(micro, msg);
wait_for_completion(&msg->ack);
return ret;
}
static inline int
ipaq_micro_tx_msg_async(struct ipaq_micro *micro,
struct ipaq_micro_msg *msg)
{
init_completion(&msg->ack);
return ipaq_micro_tx_msg(micro, msg);
}
#endif /* _MFD_IPAQ_MICRO_H_ */
Messung V0.5 in Prozent C=89 H=100 G=94
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-10-01)
¤
*© Formatika GbR, Deutschland