Exemple #1
0
static irqreturn_t r_irq_handler(int irq, void *dev_id, struct pt_regs *regs) {
	unsigned long flags;
	unsigned char data[PACKET_DATA_LENGTH_WITH_SIZE];
	int data_length;

	local_irq_save(flags);
	data_length = _receive_packet(data);
	local_irq_restore(flags);

	if(data_length == -RF_ERR_TOUT)
		return IRQ_HANDLED;

	if(data_length == -RF_ERR_CRC_ERROR) {
		printk(KERN_NOTICE DEV_NAME ": CRC error\n");
		return IRQ_HANDLED;
	}

	if(data_length > PACKET_DATA_LENGTH_WITH_SIZE) {
		printk(KERN_NOTICE DEV_NAME ": wrong data length in incoming packet (%d), packet dropped\n", data_length);
		return IRQ_HANDLED;
	}

	spin_lock(&buffer_lock);
	_add_received_packet_to_buffer(data);
	spin_unlock(&buffer_lock);
 
	return IRQ_HANDLED;
}
Exemple #2
0
unsigned char
handle_interrupt() {
    unsigned char bytes_received = _receive_packet();

    rfm12_DisableRx();
    rfm12_DisableFifo();

    // Process the packet, but only if the application has dealt with the
    // last packet.  If not, it will be silently dropped..
    if (!data_arrived) {
        _process_packet(bytes_received);
    }

    rfm12_EnableFifo();
    rfm12_EnableRx();

    return 1;
}